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 }

 

posted @ 2014-08-21 21:44  水门  阅读(210)  评论(0编辑  收藏  举报