hdu 4947 A simple dynamic programming problem(2014 Multi-University Training Contest 10)

A simple dynamic programming problem

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 316    Accepted Submission(s): 120


Problem Description
Dragon is watching NBA. He loves James and Miami Heat.

Here's an introduction of basketball game:http://en.wikipedia.org/wiki/Basketball. However the game in Dragon's version is much easier:

"There's two teams fight for the winner. The only way to gain scores is to throw the basketball into the basket. Each time after throwing into the basket, the score gained by the team is 1, 2 or 3. However due to the uncertain factors in the game, it’s hard to predict which team will get the next goal".

Dragon is a crazy fan of Miami Heat so that after each throw, he will write down the difference between two team's score regardless of which team keeping ahead. For example, if Heat's score is 15 and the opposite team's score is 20, Dragon will write down 5. On the contrary, if Heat has 20 points and the opposite team has 15 points, Dragon will still write down 5.

Several days after the game, Dragon finds out the paper with his record, but he forgets the result of the game. It's also fun to look though the differences without knowing who lead the game, for there are so many uncertain! Dragon loves uncertain, and he wants to know how many  results could the game has gone?
 

Input
The first line of input contains only one integer T, the number of test cases. Following T blocks, each block describe one test case.

For each test case, the first line contains only one integer N(N<=100000), which means the number of records on the paper. Then there comes a line with N integers (a 1, a 2, a 3, ... , a n). a i means the number of i-th record.
 

Output
Each output should occupy one line. Each line should start with "Case #i: ", with i implying the case number. Then for each case just puts an integer, implying the number of result could the game has gone.
 

Sample Input
  
  
2 2 2 3 4 1 3 5 7
 

Sample Output
  
  
Case #1: 2 Case #2: 2
 
解题思路:
       相邻差值大于3,或者相邻的相同且不为1,只有2->1或者1->2能使比分发生变化。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=100000+100;
int a[maxn];
int main()
{
     long long ans=0;
     int t;
     scanf("%d",&t);
     for(int i=1;i<=t;i++)
     {
         int n;
         ans=0;
         scanf("%d",&n);
         for(int j=1;j<=n;j++)
         scanf("%d",&a[j]);
         int sign=0;
         for(int j=2;j<=n;j++)
         {
             if(a[j]==1&&a[j-1]==2)
             {
                 ans++;
             }
            else if(a[j]==2&&a[j-1]==1)
             {
                 ans++;
             }
             else if((a[j]-a[j-1]>3||a[j-1]-a[j]>3)||(a[j]==a[j-1]&&a[j]!=1))
             {
                 ans=0;
                 sign=1;
                 break;
             }
         }
         if(sign)
         {
            printf("Case #%d: ",i);
            printf("%I64d\n",ans);
            continue;
         }
         if(a[n])
         {
             printf("Case #%d: ",i);
             printf("%I64d\n",ans*2+2);
         }
         else
         {
             printf("Case #%d: ",i);
             printf("%I64d\n",ans+1);
         }
     }
     return 0;
}


      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值