ARC #002
A.
念入りにテストしてたら、2分以上かかってしまいました。
int main(){ int n; cin>>n; if(!(n%400)){ cout<<"YES"<<endl; }else if(!(n%100)){ cout<<"NO"<<endl; }else if(!(n%4)){ cout<<"YES"<<endl; }else { cout<<"NO"<<endl; } return 0; }
B.
Aを再利用できます。因みに、閏年は英語で a leap year です。
1月1日には必ず割り切れるので、1日ずつ進めていけば確かめれば解ける。
int table[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; int uruu(int n){ if(!(n%400)){ return 1; }else if(!(n%100)){ return 0; }else if(!(n%4)){ return 1; }else { return 0; } } int main(){ int y,m,d; scanf("%d/%d/%d",&y,&m,&d); while(1){ if(!(y%(m*d))){ printf("%d/%02d/%02d\n",y,m,d); return 0; } d++; if(d>table[m]+(m==2?uruu(y):0)){ d = 1; m++; if(m>12){ m = 1; y++; } } } return 0; }
C.
全探索+greedy(LまたはRを使えるときは必ず使う)で解けます。何故greedyでいいのかは分かりませんが、合ってたみたいです。
string s; char c[] = "ABXY"; string LR[16]; int n; int f(int x,int y){ int ans = 0; for(int i = 0; i < n; i++){ ans++; if(i < n-1){ if(s[i]==LR[x][0] && s[i+1]==LR[x][1]){ i++; }else if(s[i]==LR[y][0] && s[i+1]==LR[y][1]){ i++; } } } return ans; } int main(){ for(int i = 0; i < 4; i++){ for(int j = 0; j < 4; j++){ LR[i*4+j] += c[i]; } } for(int i = 0; i < 4; i++){ for(int j = 0; j < 4; j++){ LR[i*4+j] += c[j]; } } cin>>n>>s; int ans = n; for(int i = 0; i < 16; i++){ for(int j = i+1; j < 16; j++){ ans = min(ans,f(i,j)); } } cout<<ans<<endl; return 0; }
86thでした