开始想错了,只考虑了平闰年交替的情况,wr了一发才想起了平平的情况,就补救了一发,也就是说只有闰闰是不行的,所以只要控制两个二月相加小于58就可以了。
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; const int maxn=30; int b[30]={0,31,28,31,30,31,30,31,31,30,31,30,31}; struct note { int data; int next; }aa[maxn]; void init() { for(int i=1;i<=12;i++) aa[i].data=b[i]; for(int i=1;i<=12;i++) aa[i+12].data=b[i]; aa[14].data=29; for(int i=1;i<=23;i++) aa[i].next=i+1; aa[24].next=1; } int a[maxn]; int n; int main() { init(); while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); int flag1=0; for(int i=1;i<=24;i++) { int flag2=0; int sum=0; int k=i; int kk=0; for(int j=1;j<=n;j++) { if(aa[k].data!=a[j]) { flag2=1; } if(a[j]==28||a[j]==29) { if(sum==0) { sum+=a[j]; kk=j; } else { sum+=a[j]; if(sum<58&&(j-kk)%12==0) flag2=0; } } if(flag2==1) break; k=aa[k].next; } if(flag2==0) { flag1=1; break; } } if(flag1==1) printf("Yes\n"); else printf("No\n"); } return 0; }