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;
}
posted @ 2025-08-19 17:27  cqbzcjh  阅读(12)  评论(0)    收藏  举报