hdu 4972 A simple dynamic programming problem (转化 乱搞 思维题) 2014多校10
题意:给定一个数组记录两队之间分差,只记分差,不记谁高谁低,问最终有多少种比分的可能性
分析:
类似cf的题目,比赛的时候都没想出来,简直笨到极点。。。。。
最后的差确定,只需要计算和的种类,有多少种就是多少。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <vector> 7 #include <algorithm> 8 #define LL __int64 9 const int maxn = 100000+10; 10 using namespace std; 11 int a[maxn]; 12 13 int main() 14 { 15 int i, t, n, ca = 1, ans, f; 16 scanf("%d", &t); 17 while(t--) 18 { 19 ans = 0; f = 0; 20 scanf("%d", &n); 21 for(i = 1; i <= n; i++) 22 { 23 scanf("%d", &a[i]); 24 if(i>=2) 25 { 26 if(a[i-1]==1 && a[i]==2) 27 ans ++; 28 if(a[i-1]==2 && a[i]==1) 29 ans ++; 30 if(a[i-1]==a[i] && a[i]!=1) //这两种都是不符合规则的 31 f = 1; 32 if(abs(a[i]-a[i-1])>3) 33 f = 1; 34 } 35 } 36 if(f) 37 printf("Case #%d: 0\n", ca++); //不存在的情况 38 else if(a[n]==0) 39 printf("Case #%d: %d\n", ca++, ans+1); //最后分差为0,结果少了一半 40 else 41 printf("Case #%d: %d\n", ca++, 2*ans+2); 42 } 43 return 0; 44 }