现在的位置: 首页 > 综合 > 正文

hdu 4972

2017年11月21日 ⁄ 综合 ⁄ 共 1016字 ⁄ 字号 评论关闭

今天比赛有点消极比赛。。。所以。。。。因为题目说是dp,所以一直在想怎么建一个状态转移方程,然后就想多了,感觉题解的思路还是挺简单的。。。。。

首先,分差是随着分数积上去的,所以当分差大于等于3分的时候,分数增加的那一方(赢家)就确定了,还有因为是一局一局来的,所以每轮都是独立的,就算这一轮的情况有两种也没有关系,互不影响。

然后当分数是1->2或者2->1的时候,会有两种情况。

然后看到有题解说要判断错误的输入数据,但是看题的时候好像没说数据输入可能非法,自己没有多花精力在这里。

然后跑了七百多wa了,表示不想查。。。

嗷,还有发现c++的输入输出真的很慢。。。。心血来潮用了一下居然tle了。。。

**********************************************

今天早上又理了一下思路,再写一遍就过了,耶~ 首先是非法输入要处理,以后也尽量有这个意识。然后是题目要求的是最后分数不一样的情况。所以当最后分数相同时,就没有必要乘二了。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define maxn 100010
int a[maxn];
int main()
{
    int t,cas=0;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        int sum=1;
        int i,flag=0;
        scanf("%d",&n);
        memset(a,0,sizeof(a));
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            if(abs(a[i]-a[i-1])>3||a[i]==a[i-1]&&a[i]!=1) flag=1;
            if(a[i]==2&&a[i-1]==1||a[i]==1&&a[i-1]==2) sum++;
           // printf("**%d",a[i]);
        }
     //   printf("\n%d\n",sum);
        if(flag||!n) {printf("Case #%d: 0\n",++cas);continue;}
        if(a[n])
            sum*=2;
        printf("Case #%d: %d\n",++cas,sum);
    }
    return 0;
}

【上篇】
【下篇】

抱歉!评论已关闭.