luogu P10132 [USACO24JAN] Cannonball B题解
分析
水题,只需要跟着题意模拟 Bessie 的跳跃即可。
特殊情况是出现死循环,在一个区间里不断重复的跳跃(例如两个弹板能量是 0,刚好 Bessie 从一个弹板跳到另一个弹板上),这时就需要判断 Bessie 的能量是否变化,如果重复多次能量没有变化,则跳出循环。
Code
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
struct node{
int q,v;
}a[N];
int n,s,ans,t=1,k=1;
int main(){
scanf("%d%d",&n,&s);
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].q,&a[i].v);
int i=s,tmp,p=0;
for(;i<=n&&i>=1;i+=t*k){
tmp=k;//tmp记录上一次的能量
if(a[i].q==1&&k>=a[i].v){
ans++;
a[i].q=-1;//目标被摧毁
}
if(a[i].q==0){
k+=a[i].v;
t=-t;
}
if(tmp==k)p++;//判断能量是否变化
if(p>=n*3)break;//如果重复多次能量不变则退出循环
}
printf("%d",ans);
return 0;
}

浙公网安备 33010602011771号