AcWing 730. 机器人跳跃问题(贪心做法)
原题链接
中等
作者:
Safe_Sound
,
2020-02-20 18:09:39
,
所有人可见
,
阅读 840
/*题目要求最小值,等价于,我们刚好能达到N,而不变成负数.
现考虑最坏情况,假设最后达到第n座建筑时候,能量值变为0,说明最后失去了H(n) - En-1的能量,En-1为前一座建筑
上那个机器人所具有的能量.即达到第n座建筑的机器人能量值为En= En-1 - (Hn - En-1)= 2En-1 - Hn -> En = 2En-1 - Hn
则En-1 = En + Hn / 2,现已知En = 0,H(1~n)均为已知,可以由这个递推式求出E0的值
*/
/*#include<cstdio>
#include<iostream>
using namespace std;
const int N = 100010;//别问我为什么是这个数,瞎掰的,我怎么知道测试数据是多少2333
int n;
int H[N];
int main(){
int E = 0;//E从0开始更新
cin >> n;
for(int i = 0; i < n; i++) cin >> H[i];
for(int i = n - 1; n >= 0; n--){
//E =( E + H[i] ) / 2; 这样直接做是会出错的,因为C++的int类型整除是向下取整,如果是奇数的话整除2会少1的,所以要加上判断条件.
if( (E + H[i]) % 2 == 0){
E =( E + H[i] ) / 2;
}
else E =( E + H[i] ) / 2 + 1;
}
cout << E;
return 0;
*/
#include<iostream>
using namespace std;
const int N = 100010;
int H[N];
int n;
int main(){
cin >> n;
for(int i = 1; i <= n; i++) cin >> H[i];
int E = 0;
for(int i = n; i >= 1; i--){
if((E+ H[i]) % 2 == 0){
E = (E+ H[i]) / 2;
}
else{
E = (E+ H[i]) / 2 + 1;
}
}
cout << E;
return 0;
}
//服了,我最开始的代码错在哪里...