Codeforces Round #614 题解
A题
关注到本题的数据量不大但是数据很大,可以使用暴力+哈希的方法
将关闭的餐厅放到map遍历
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<map> #include<algorithm> using namespace std; typedef long long ll; const int N=4e5+10; const int inf=0x3f3f3f3f; map<ll,int> m1; int main(){ int t; cin>>t; while(t--){ int n; m1.clear(); int k; int i; int s; int x; cin>>n>>s>>k; for(i=1;i<=k;i++){ cin>>x; m1[x]=1; } int sum=0; for(i=s;i<=n;i++){ if(m1[i]){ sum++; } else break; } if(i==n+1) sum=inf; int res=0; for(i=s;i>=1;i--){ if(m1[i]){ res++; } else break; } if(i==0) res=inf; cout<<min(res,sum)<<endl; } }
B题
学习到了一点,当我们能推出公式但是做不出答案的时候,但是有很多人过,就可以合理猜测答案后证明,一般都是猜测一半或者1,本题答案正是每次1个
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<map> #include<algorithm> using namespace std; typedef long long ll; const int N=4e5+10; const int inf=0x3f3f3f3f; const double eps=0.004; int main(){ int n; double sum=0; cin>>n; for(int i=1;i<=n;i++) sum+=1.0/i; cout<<sum<<endl; }
C题
这题数据量很大,但是很好看出解答方法,因为只有两排,只要根据情况判断左右,左上右上左下右下几个位置,我进行了暴力枚举发现超时。
所以我的想法是如何能保留住之前情况下不合法的所有状态,并对每次q进行更新。
所以我们可以用一个cnt来表述非法状态,然后枚举当前位置的几个隔壁方位,对总量进行修改。
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<map> #include<algorithm> using namespace std; typedef long long ll; const int N=4e5+10; const int inf=0x3f3f3f3f; int g[3][N]; int main(){ int n,q; cin>>n>>q; int cnt=0; while(q--){ int x,y; cin>>x>>y; int z=1; if(x==1) z=2; if(g[x][y]){ cnt=cnt-g[z][y]-g[z][y-1]-g[z][y+1]; } else cnt=cnt+g[z][y]+g[z][y-1]+g[z][y+1]; if(cnt) cout<<"No"<<endl; else cout<<"Yes"<<endl; g[x][y]^=1; } }
没有人不辛苦,只有人不喊疼