算法题:水洼有多少(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
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;
    }   
}

你可能感兴趣的:(简单题,C++,算法,计算机基础)