题意 : 每次无论哪个队投进一个篮球,就记下现在两队比分的差值,问你最后的结果有多少种情况。
思路 : 该题实在是不好理解,最后的结果有多少种情况就是说不管中间过程怎么来的,只要最后结果不一样的情况。因为会有不合法数据,类似于2 2 2 或者是1 5 9 23这种数据,非法数据就是0种情况,但是1 1 1 这种情况是可以的,你赢了1分的球,我下次赢了2分的球,差值还是1 ,由此也推断,整个数列中会产生不同情况的地方只有1 2 或者2 1 这些情况,你赢了1分球,然后你又赢了1分球,差值为2 ,与你赢了1分球我赢了3分球差值还为2 如果最后结果不一样 的话就是两种情况。
1 #include <cstdio> 2 #include <cstring> 3 #include <math.h> 4 #include <iostream> 5 #define LL long long 6 7 using namespace std ; 8 int a[100010] ; 9 10 int main() 11 { 12 int T,n,casee = 1 ; 13 scanf("%d",&T) ; 14 while(T--) 15 { 16 scanf("%d",&n) ; 17 for(int i = 1 ; i <= n ; i++) 18 { 19 scanf("%d",&a[i]) ; 20 } 21 LL ans = 1 ; 22 bool flag = true ; 23 for(int i = 2 ; i <= n ; i++) 24 { 25 if(fabs(a[i]-a[i-1]) > 3) 26 { 27 flag = false ; 28 break ; 29 } 30 if(a[i] == a[i-1] && a[i] != 1) 31 { 32 flag = false ; 33 break ; 34 } 35 if(a[i] == 1 && a[i-1] == 2) ans ++ ; 36 if(a[i] == 2 && a[i-1] == 1) ans ++ ; 37 } 38 printf("Case #%d: ",casee++) ; 39 if(!flag) 40 { 41 printf("0\n") ; 42 continue; 43 } 44 else if(a[n] == 0) 45 { 46 printf("%I64d\n",ans) ; 47 continue ; 48 } 49 printf("%I64d\n",ans*2) ; 50 } 51 return 0 ; 52 }