アルゴリズムの問題:水たまりはいくらあります(C++)


题目:数字を入力して、この段の空间の各点の高低を表して、それから、计算して、このような情况の下で、雨が降った后に(雨が大きいことを保证して、つまり、もし水たまりを形成することができるならば、それはきっと形成します)例えば:0 1 2 3は水たまりを形成しません;1 0 2このように水たまりを形成することができ、量は1である.(柱状図を想像して)私たちは水たまりの量を出力しますが、これは計算するものです.
テストデータのセットを与える
4 10 0 1 2 1 0 1 3 2 0 1 3 10 1 9 4 3 1 2出力の結果:5 8 1
コードは次のとおりです.
#include 
#include 
using namespace std;

int main(){
    int time;
    cin>>time;
    while (time--){
        int n, t;
        cin >> n;
        int *a = new int [n];
        for (int i = 0; i < n; ++i) {
            cin >> a[i];
        }
        int sum = 0;
        bool first = true;
        for (int i = 0; i < n;) {//find hill
            if (a[i] == 0 || i == n){
                i++;
            } else if (first) {//This one is a hill
                first = false;
                int j = i+1, temp = 0;
                for (; j < n-1; ++j) {
                    if (a[j] > a[j -1] && a[j] > a[j + 1]) {// find another hill
                        break;
                    }
                    temp += a[j];
                }
                if (j == n - 1 && a[i + 1] >= a[j]){
                    temp -= a[i + 1];
                    sum += (min(a[i + 1], a[j]) * (j - i - 2) - temp);
                } else {
                    sum += (min(a[i], a[j]) * (j - i - 1) - temp);
                }
                i = j; //refresh the hill
            } else {
                int j = i+1, temp = 0;
                for (; j < n-1; ++j) {
                    if (a[j] > a[j -1] && a[j] > a[j + 1]) {// find another hill
                        break;
                    }
                    temp += a[j]; 
                }
                if (j == n - 1 && a[i + 1] >= a[j]){
                    temp -= a[i+1];
                    sum += (min(a[i + 1], a[j]) * (j - i - 2) - temp);
                } else {
                    sum += (min(a[i], a[j]) * (j - i - 1) - temp);
                }
                i = j; //refresh the hill
            }
        }
        cout << sum << endl;
        delete a;
    }   
}