挺水的题……在手机上写完了1A了……
我们挨个障碍物考虑,记录一下当前坐标,因为他要求点的次数尽量少,那么我们算出走到下一个障碍物最少要点多少下,然后判断是否大于当前剩余的可以点的次数即可
我们挨个障碍物考虑,记录一下当前坐标,因为他要求点的次数尽量少,那么我们算出走到下一个障碍物最少要点多少下,然后判断是否大于当前剩余的可以点的次数即可
那么我们只需要维护当前还能点多少次即可,从一个障碍物走到另一个障碍物,可以点的数量就会增加两个障碍物的距离,另外,我们还要求不能撞到上边界,所以每到一个障碍物,剩余次数就和再点多少次碰顶取min即可
#include<iostream>
#include<cstdio>
#include<algorith>
using namespace std;
int n;
int nowx,nowy,ans,rem;
int main(){
int i,x;
scanf("%d%*d",&n);
for(i=1:i<=n;i++){
scanf("%d%d%d",&x,&l,&r);
rem+=x-nowx;
nowy-=x-nowx;
nowx=x;
if(nowy<=l){
int t=(l+2-nowy)/2;
rem-=t;
nowy+=t*2;
ans+=t;
}
if(rem<0||nowy>=r){
printf("NIE\n");
return 0;
}
rem=min(rem,(r-1-nowy)/2);
}
printf("%d\n",ans);
return 0;
}