算法题:水洼有多少(C++)

来源:互联网 发布:约战竞技场出招优化 编辑:程序博客网 时间:2024/05/02 20:20

题目:
输入一串数字,表示这一段空间的各个点的高低
然后,算出来,在这样的情况下,下雨后(保证雨很大,就是说,如果能形成积水,那就一定会形成)
如:
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 <iostream>#include <algorithm>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;    }   }
原创粉丝点击