アルゴリズムの問題:水たまりはいくらあります(C++)
4662 ワード
题目:数字を入力して、この段の空间の各点の高低を表して、それから、计算して、このような情况の下で、雨が降った后に(雨が大きいことを保证して、つまり、もし水たまりを形成することができるならば、それはきっと形成します)例えば: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
コードは次のとおりです.
テストデータのセットを与える
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;
}
}