我听说 imcy 学长说有个一个 叫dc的某学长这个题打了N行
imcy 笑了;然后—–>>
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int nums[100100];
int ans = 0;
int main()
{
int n;
scanf("%d",&n);
for(int i = 1; i <= n; i ++)
scanf("%d",&nums[i]);
for(int i = 1; i <= n; i ++)
ans += max(nums[i] - nums[i-1], 0);
printf("%d\n",ans);
return 0;
}
他说 他10+ 行就能搞定,我信了。
———
===== 第0列↑====第1列↑====第2列↑====第3列↑====第4列↑====第5列↑
上面是样例↑ 从 0 ~n;
代码的意思是:比较 加上 第 i 列 与前一列的正数差 如果 减出来是负数那么 + 0;
–>证明
(1)
如果减出来是正数 那么如果升高 这一列比前一列高出的部分 那么就需要 ‘差’(第 1列与前一列的‘差’为 2)次 才能把这一列都升高到指定高度
(2)
如果减出来是正数 那么说明在 i 列 之前 进行别的升高积木时 已经可以顺带着把这一行升高了 就 + 0;(第2列相比第一列需要升高1格 因为 第 3格及以下格在处理第1列时已经顺带着升了)
证明完毕。
虽然短但是不太好想啊= = Orz
题外话:这两天 神犇们去考省选 2016 SDOI RP++ Orz。