今天比赛有点消极比赛。。。所以。。。。因为题目说是dp,所以一直在想怎么建一个状态转移方程,然后就想多了,感觉题解的思路还是挺简单的。。。。。
首先,分差是随着分数积上去的,所以当分差大于等于3分的时候,分数增加的那一方(赢家)就确定了,还有因为是一局一局来的,所以每轮都是独立的,就算这一轮的情况有两种也没有关系,互不影响。
然后当分数是1->2或者2->1的时候,会有两种情况。
然后看到有题解说要判断错误的输入数据,但是看题的时候好像没说数据输入可能非法,自己没有多花精力在这里。
然后跑了七百多wa了,表示不想查。。。
嗷,还有发现c++的输入输出真的很慢。。。。心血来潮用了一下居然tle了。。。
**********************************************
今天早上又理了一下思路,再写一遍就过了,耶~ 首先是非法输入要处理,以后也尽量有这个意识。然后是题目要求的是最后分数不一样的情况。所以当最后分数相同时,就没有必要乘二了。
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #define maxn 100010 int a[maxn]; int main() { int t,cas=0; scanf("%d",&t); while(t--) { int n; int sum=1; int i,flag=0; scanf("%d",&n); memset(a,0,sizeof(a)); for(i=1;i<=n;i++) { scanf("%d",&a[i]); if(abs(a[i]-a[i-1])>3||a[i]==a[i-1]&&a[i]!=1) flag=1; if(a[i]==2&&a[i-1]==1||a[i]==1&&a[i-1]==2) sum++; // printf("**%d",a[i]); } // printf("\n%d\n",sum); if(flag||!n) {printf("Case #%d: 0\n",++cas);continue;} if(a[n]) sum*=2; printf("Case #%d: %d\n",++cas,sum); } return 0; }