2 条题解
-
0
思路:
考虑暴力模拟,判环的话就是记 为第 个位置下一步跳到的位置的集合,如果下一步要跳到的位置为 ,若 ,则之前进行过这样的操作,就重复了,退出即可。
时间复杂度为 。
完整代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef double db; const ll N=100100; inline ll read(){ ll x=0,f=1; char c=getchar(); while(c<'0'||c>'9'){ if(c=='-') f=-1; c=getchar(); } while(c>='0'&&c<='9'){ x=(x<<1)+(x<<3)+(c^48); c=getchar(); } return x*f; } inline void write(ll x){ if(x<0){ putchar('-'); x=-x; } if(x>9) write(x/10); putchar(x%10+'0'); } ll n,s,p=1,t=1,ans; struct Node{ ll op; ll x,f; }a[N]; set<ll> S[N]; int main(){ n=read(),s=read(); for(int i=1;i<=n;i++) a[i]={read(),read(),0}; while(s>=1&&s<=n){ // cout<<a[s].f<<'\n'; if(!a[s].op){ t*=(-1); p+=a[s].x; } else{ if(p>=a[s].x&&!a[s].f){ // cout<<s<<'\n'; ans++; a[s].f=1; } } if(S[s].count(s+p*t)) break; S[s].insert(s+p*t); s+=p*t; } write(ans); return 0; } -
0
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int n,m,a[N],b[N]; int res=1,f=1,ans; int main() { int n,p;scanf("%d%d",&n,&p); for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]); int res=1,f=1,ans=0,t=0; while(1<=p && p<=n) { if(a[p]==1) { if(b[p]<=res){ a[p]=-1;ans++;} } else if(a[p]==0) { res+=b[p]; f=-f; } p+=res*f; t++;if(t>1000000)break; } printf("%d",ans); return 0; }
- 1
信息
- ID
- 7503
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 170
- 已通过
- 25
- 上传者