http://acm.hdu.edu.cn/showproblem.php?pid=4972
两支球队进行篮球比赛,每进一次球后更新比分牌,比分牌的计数方法是记录两队比分差的绝对值,每次进球的分可能是1,2,3分。给定比赛中的计分情况,问说最后比分有多少种情况。
分情况讨论即可:
相邻计分之差大于3或者相等并且不等于1的话,为非法输入
相邻计分为1-2或者2-1的时候,会对应有两种的的分情况
其他情况下,不会造成新的比分情况产生
需要特判对于最后一次比分差为0的情况,就没有谁赢谁输一说。
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int main() { long long T,n,cas=0,ok,l,r,ans; long long a[110000]; scanf("%I64d",&T); while (T--){ cas++; scanf("%I64d",&n); for (int i=1;i<=n;i++) scanf("%I64d",&a[i]); a[0]=0; l=0; r=0; ok=1; if (n==0){ printf("Case #%I64d: 1\n",cas); continue; } for (int i=1;i<=n;i++){ if (a[i]<0 || abs(a[i]-a[i-1])>3) {ok=0;break;} else if (a[i]==a[i-1] && (a[i]!=1 || a[i-1]!=1)) {ok=0;break;} else if (a[i-1]==1 && a[i]==1) {l+=1;r+=1;} else if (a[i-1]==1 && a[i]==2) {r+=2;} else if (a[i-1]==2 && a[i]==1) {l+=1;r+=1;} else if (a[i-1]<a[i]) r+=abs(a[i]-a[i-1]);else if (a[i-1]>a[i]) l+=abs(a[i]-a[i-1]); // printf("%d %d\n",l,r); } if (!ok) ans=0;else if (a[n]==0) ans=(r-l-a[n]+1); else ans=(r-l-a[n]+1)*2; printf("Case #%I64d: %I64d\n",cas,ans); } return 0; }