7-1 Panda and PP Milk (20分)
这道题杀死了不少同学的心态,但是如果想到方法了就特别简单
简单说下做法,一共对全表进行两次扫描,第一次从左到右,第二次从右到左,每次扫描时,如果后面熊猫比前面重,则供奶量+1(以2、3、4计,最后统一乘100)如果体重持平,则保持不变,体重减轻,则供奶量恢复为2,从左向右扫描满足所有熊猫看到自己左边的熊猫都会满意,从右向左满足右边熊猫,对每个熊猫取两次扫描中的较大值,即为答案。
体重 | 180 | 160 | 100 | 150 | 145 | 142 | 138 | 138 | 140 |
---|---|---|---|---|---|---|---|---|---|
左向右 | 2 | 2 | 2 | 3 | 2 | 2 | 2 | 2 | 3 |
右向左 | 4 | 3 | 2 | 5 | 4 | 3 | 2 | 2 | 2 |
最终供奶量 | 4 | 3 | 2 | 5 | 4 | 3 | 2 | 2 | 3 |
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 10005;
const int WMAX = 205;
int main() {
int n, wight[NMAX], milk_l[NMAX], milk_r[NMAX];
cin >> n;
for (int i = 0; i < n; i++) {
cin >> wight[i];
}
int pre, now_milk;
now_milk = 2;
pre = WMAX;
for (int i = 0; i < n; i++) {
// 左向右扫
if (wight[i] > pre) {
now_milk++;
} else if (wight[i] == pre) { ; //体重相等供奶量保持不变
} else {
now_milk = 2;
}
milk_l[i] = now_milk;
pre = wight[i];
}
now_milk = 2;
pre = WMAX;
for (int i = n - 1; i >= 0; i--) {
// 右向左扫
if (wight[i] > pre) {
now_milk++;
} else if (wight[i] == pre) { ;
} else {
now_milk = 2;
}
milk_r[i] = now_milk;
pre = wight[i];
}
int sum = 0;
for (int i = 0; i < n; i++) {
sum += max(milk_l[i], milk_r[i]); // 取较大者
}
cout << sum * 100;
return 0;
}
至于这题是怎么想到的?我也不知道。可能是考场上的灵光一现吧,要是换个时间再来一次,我可能也想不到这样做了。
后三题写在我的博客了PAT 2020年秋考解答