题解:CF1932A Thorns and Coins

· · 题解

题目传送门

这道题很明显可以用模拟过去,我们来算一下时间复杂度。

极限情况:t=1000,n=50 。

# 那么该怎么模拟呢? 听我娓娓道来。 很简单。 用一个 $ans$ 和一个 $cnt$ 来分别记录答案和荆棘数就好了。 碰见一个金币赶紧记录,当连续有两个荆棘我们就跳出模拟。 为什么碰见连续的两个荆棘就跳出呢? ![tu](https://cdn.luogu.com.cn/upload/image_hosting/alro55gb.png) 走一步还是两步都走不过去。 这样即使荆棘后面是人人都爱的金币也无济于事。 [AC](https://www.luogu.com.cn/record/158107642) 代码: ```cpp #include<bits/stdc++.h> using namespace std; typedef long long ll; string a; int n; signed main() //signed 是有符号的意思,可以代替int(小装一下) { int t; cin>>t; while(t--) { cin>>n; cin>>a; int cnt=0,ans=0; for(int i=0;i<n;i++) { if(a[i]=='*') cnt++; //记录连续的荆棘 else cnt=0; //没了荆棘就把记录归零 if(cnt>=2) break; //荆棘数过多导致没法走了,就跳出循环 if(a[i]=='@') ans++; //记录金币 } cout<<ans<<endl; //输出!!!! } return 0; } ``` 无注释代码: ```cpp #include<bits/stdc++.h> using namespace std; typedef long long ll; string a; int n; signed main() { int t; cin>>t; while(t--) { cin>>n; cin>>a; int cnt=0,ans=0; for(int i=0;i<n;i++) { if(a[i]=='*') cnt++; else cnt=0; if(cnt>=2) break; if(a[i]=='@') ans++; } cout<<ans<<endl; } return 0; } ```