CodeForces - 471A
首先要有四个数相等,然后剩下两个数不同就是Bear,否则就是Elephant。
#include <bits/stdc++.h> using namespace std; typedef pair<int,int> PII; int num[10]; int a; int main() { memset(num,0,sizeof(num)); for(int i=1;i<=6;i++) { scanf("%d",&a); num[a]++; } bool flag=false; for(int i=1;i<=9;i++){ if(num[i]>=4){ num[i]-=4; flag=true; break; } } if(flag){ for(int i=1;i<=9;i++){ if(num[i]==2){ puts("Elephant"); return 0; } } puts("Bear"); } else{ puts("Alien"); } return 0; }
CodeForces - 471B
先要判断满足,然后sort完本身是一种,然后交换一次又是一种,标记掉,再交换,就有三种了。
#include <bits/stdc++.h> using namespace std; typedef pair<int,int> PII; int tp; int num[2010]; int n; struct asd{ int id; int w; }; asd a[2010]; bool cmp(asd x,asd y){ if(x.w==y.w) return x.id<y.id; return x.w<y.w; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i].w); num[a[i].w]++; a[i].id=i; } sort(a+1,a+n+1,cmp); int sum=1; for(int i=1;i<=2000;i++){ if(num[i]){ sum*=num[i]; if(sum>=3){ puts("YES"); for(int i=1;i<=n;i++) printf("%d ",a[i].id); puts(""); for(int i=1;i<=n;i++){ if(i+1<=n){ if(a[i].w==a[i+1].w){ printf("%d %d ",a[i+1].id,a[i].id); tp=i; i++; } else printf("%d ",a[i].id); } else printf("%d ",a[i].id); } puts(""); for(int i=1;i<=n;i++){ if(i+1<=n){ if(a[i].w==a[i+1].w&&i!=tp){ printf("%d %d ",a[i+1].id,a[i].id); i++; } else printf("%d ",a[i].id); } else printf("%d ",a[i].id); } return 0; } } } puts("NO"); return 0; }
CodeForces - 471C
#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int,int> PII; int main() { LL n; int k=0; scanf("%lld",&n); for(LL i=3-n%3;; i+=3) { if((2*(n+i))<(3*i*(i+1))) break; k++; } printf("%d ",k); return 0; }
CodeForces - 471D
思路:
先特判掉m=1的时候,因为只要满足变化规律匹配就OK,所以相邻做个差,得到两个新串,然后就是求b串在a串里出现的次数(注意这个次数aa在aaa中出现2次),KMP即可;#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int,int> PII; const int N=2e5+10; int n,m; int a[N],b[N]; int a_num,b_num; int Next[N]; void GetNext() { int i=0,j=-1; Next[0]=-1; while(i<b_num){ if(j==-1||b[i]==b[j]) Next[++i]=++j; else j=Next[j]; } } int KMP() { GetNext(); int ans=0; int i=0,j=0; while(i<a_num){ if(j==-1||a[i]==b[j]) { i++; j++; if(j==b_num){ j=Next[j]; ans++; } } else j=Next[j]; } return ans; } int main() { int pre,x; scanf("%d%d",&n,&m); if(m==1){ printf("%d ",n); return 0; } a_num=b_num=0; scanf("%d",&pre); for(int i=2;i<=n;i++){ scanf("%d",&x); a[a_num++]=x-pre; pre=x; } scanf("%d",&pre); for(int i=2;i<=m;i++){ scanf("%d",&x); b[b_num++]=x-pre; pre=x; } printf("%d ",KMP()); return 0; }