Codeforces Round #627 (Div. 3)(A--D)
Posted liyexin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #627 (Div. 3)(A--D)相关的知识,希望对你有一定的参考价值。
题意:看着挺长的,实际上就这么些东西,俄罗斯方块。操作1:放2*1的块,随便无限放。操作2:非0集体减1。问最后是否能把方块全消除完。
解析:找一个最高的maxx,看其他能否全部变成maxx,由于放的方法是每次+2,那么看每个方块与maxx的差值,偶数即可。全为偶数就是YES,否则NO。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1e2+10; int a[maxn]; int main() { int t; cin>>t; while(t--) { int n; cin>>n; int maxx=-1; for(int i=0;i<n;i++) { cin>>a[i]; if(a[i]>maxx) maxx=a[i]; } int ok=0; for(int i=0;i<n;i++) { if(a[i]<maxx) { int mid=maxx-a[i]; if(mid%2!=0) { ok=1;break; } } } if(ok) cout<<"NO"<<endl; else cout<<"YES"<<endl; } }
题意:能否从已给的数组中找到一个子串而且是回文。注意这个子串中间的元素是可以不连续的,但要保证顺序。
解析:题中说len>=3,那么就很简单了,我们只需要看Len==3的就可以了。因为对于len>3的任意回文串,里面一定存在一个len==3的回文子串(不一定连续)。len==3的回文串,a[1]一定==a[3],那么我们只需要两个for就可以了。对于当前的a[i],往后找到一个a[j]==a[i]而且,j!=i+1。即可
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=5e3+10; int a[maxn]; int main() { int t; cin>>t; while(t--) { int n; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } int ok=0; for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { if(a[i]==a[j]&&j>i+1) { ok=1;break; } } } if(ok) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }
题意:青蛙从0跳到n+1,到哪一格,就要执行当前格的方向跳,L就往左,R就往右。要求给出一个d,此为最长跳跃距离。找出最小的一个d来。而且保证一定能从0跳到n+1。
解析:其实这个题不用管L的,只需要看R就好了,因为只有R才能保证到达终点呀。样例1是有点误导的意思。记下所有R的出现位置,找到它们所有的间距,输出最大的就好了。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=2e5+10; int a[maxn]; char s[maxn]; int main() { int t; cin>>t; while(t--) { cin>>s; int len=strlen(s); int l,r; int ok=0,ok2=0; int tot=0; for(int i=0;i<len;i++) { if(s[i]==‘R‘) { ok=1; a[tot++]=i; } else { ok2=1; } } if(!ok) { cout<<len+1<<endl;continue; } int maxx=-1; for(int i=0;i<tot-1;i++) { int mid=a[i+1]-a[i]; if(mid>maxx) maxx=mid; } int kk=max(a[0]+1,len-a[tot-1]); cout<<max(kk,maxx)<<endl; } }
题意:要求对于i<j,ai+aj>bi+bj,找出有几对。
解析: 看这数据,暴力行不通的。我刚开始纠结于顺序i<j的问题,所以没有A出来。我们可以把这个式子变一下,ai-bi+aj-bj>0。即ci+cj>0。这不就和顺序没有关系了嘛。直接把每个a[i]-b[i]存一下,再二分查找就可以了。记得开LL。。O(n*logn)的复杂度
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<set> using namespace std; typedef long long ll; const int maxn=2e5+10; ll a[maxn]; ll b[maxn]; ll vis[maxn]; int main() { int n; cin>>n; for(int i=1;i<=n;i++) scanf("%lld",&a[i]); for(int i=1;i<=n;i++) scanf("%lld",&b[i]); for(int i=1;i<=n;i++) { vis[i]=a[i]-b[i]; } sort(vis+1,vis+n+1); ll l=1,r=n; ll sum=0; while(l<r) { if(vis[l]+vis[r]>0) { sum+=r-l; r--; } else l++; } cout<<sum<<endl; }
以上是关于Codeforces Round #627 (Div. 3)(A--D)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #627 (Div. 3) 补题
Codeforces Round #627 (Div. 3)
Codeforces Round #627 (Div. 3)(A--D)
Codeforces Round #627 (Div. 3) D. Pair of Topics(二分/直接遍历)
Codeforces Round #627 (Div. 3)F. Maximum White Subtree
Codeforces Round #627 (Div. 3) F - Maximum White Subtree(深度优先搜索)