開啟章節選單

1260 Sales

題目連結

題目敘述

CozyWalk 公司 CEO Cooper 先生,自公司成立起每天都會收到當天的銷售報告。從公司成立的第二天起,他會將當天的報告與之前所有的報告進行比較,計算出那些銷售額小於或等於當天銷售額的天數。獲得這個數值後,他會將其記錄在一個列表中。

這個問題可以更正式地表述如下: 設 A = (a₁, a₂, ..., aₙ) 為每天的銷售額列表。Cooper 先生會維護另一個整數列表 B = (b₁, b₂, ..., bₙ₋₁),每個值代表滿足條件的前幾天數量。在第 i 天 (2 ≤ i ≤ n),他會計算 bᵢ₋₁,它是滿足 ak ≤ aᵢ 的 ak 的數量,其中 1 ≤ k < i。

例如,假設 A = (20, 43, 57, 43, 20)。第四天的銷售額 a₄ = 43,比它小或等於的前幾天銷售額有 a₁ ≤ a₄, a₂ ≤ a₄,a₃ > a₄,因此有 2 天符合條件,因此 b₃ = 2。類似地,可計算出 b₁, b₂ 和 b₄,結果為 B = (1, 2, 2, 1)。

給定一個大小為 n 的銷售額列表 A,請寫一個程式輸出列表 B 中 n - 1 個整數的總和。

輸入格式

你的程式需從標準輸入讀取資料。輸入包含 T 組測試資料。第一行為整數 T,代表測試資料組數。每組測試資料以一行整數 n 開始,代表 A 的長度 (2 ≤ n ≤ 1000)。接著一行有 n 個整數 aᵢ (1 ≤ aᵢ ≤ 5000),代表每日銷售額。

輸出格式

對每組測試資料,輸出列表 B 中 n − 1 個整數的總和。

解題思路

針對每一天的銷售額,統計前面天數中小於或等於它的銷售次數,並將這些次數加總。使用 vector<int> v 錄歷史銷售額,每輸入一筆新資料時與先前所有資料比較,累加符合條件的次數,最後輸出總和。時間複雜度為 O(n²)。

程式碼

#include<bits/stdc++.h>
using namespace std;

int main(){
    int t;
    cin >> t;
    while(t--) {
        int n;
        cin >> n;
        vector<int> v;
        int ans = 0, a;
        for (int i = 0; i < n; i++) {
            cin >> a;
            for (int j : v) {
                if (j <= a) {
                    ans++;
                }
            }
            v.push_back(a);
        }
        cout << ans << "\n";
    }
}

練習題