Codeforces Round #627 (Div. 3)
A. Yet Another Tetris Problem
题意:俄罗斯方块 给你每一列的高度 每次只能竖着放尺寸2*1的长方形,问是否能全部消除
#include <iostream> #include <algorithm> using namespace std; const int N=110; int a[N]; int t,n; int main() { scanf("%d",&t); while(t--) { bool flag=true; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+1+n); for(int i=n;i>=1;i--) for(int j=i;j>=1;j--) { if((a[i]-a[j])%2!=0) { flag=false; break; } } if(flag) printf("YES\n"); else printf("NO\n"); } }
B. Yet Another Palindrome Problem
题意:找长度为3的回文串 只要找到两个不相邻的数相等就满足题意
#include <iostream> #include <algorithm> using namespace std; const int N=5010; int a[N]; int t,n; int main() { scanf("%d",&t); while(t--) { bool flag=false; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) for(int j=n;j>=i+2;j--) { if(a[i]==a[j]) { flag=true; break; } } if(flag) printf("YES\n"); else printf("NO\n"); } }
C. Frog Jumps
题意:给一个字符串长度为n里面有'L' 'R' 分别可以向左或者向右移动d长度 在可以跳到终点n+1的情况下,问d最小是多长。
分析:即求两个 ‘R’之间和最后一个‘R'和终点距离的最大值
#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int N=200100; char s[N]; int t; int main() { scanf("%d",&t); while(t--) { int x=0,res=0; scanf("%s",s+1); int len=strlen(s+1); for(int i=1;i<=len;i++) { if(s[i]=='R') { res=max(res,i-x); x=i; } } res=max(res,len+1-x); printf("%d\n",res); } }
D. Pair of Topics
题意 给两个长度为n的a,b数组,求满足 ai+aj>bi+bj (i<j)的i和j的对数
分析:移向 ai-bi+aj-bj>0 另a-b=c 即满足 ci+cj>0 的对数
故构造c数组 排序 二分或者双指针算出结果
#include <iostream> #include <algorithm> using namespace std; const int N=200100; int a[N],b[N],q[N]; long long n,ans; int main() { scanf("%lld",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&b[i]); for(int i=1;i<=n;i++) q[i]=a[i]-b[i]; sort(q+1,q+1+n); int l=1,r=n; while(l<r) { if(q[l]+q[r]>0) { ans+=r-l; r--; } else l++; } printf("%lld\n",ans); }