hdu5246 超级赛亚ACMer (百度之星初赛)(模拟)

题意:一个初始战斗力上限为m的选手,和战斗力相同的人战斗后,该选手最多可提升k点战斗力,每提升一次k值减一;和战斗力低于他的人战斗,战斗力不变;

         n名挑战者,给出每名挑战者的战斗力,问他是否能将挑战者全部打败;

思路:先sort,然后找到和他初始战斗力上限最接近的且比他弱的战斗力,然后根据下一个比他强的人提升战斗力,看是否能打败最后一个;

        比赛的时候思路完全正确,然后TLE了。补题是终于发现是for里面漏了一个条件,考虑的不仔细。弱!!!

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
__int64 a[50010],m,k;
__int64 temp,shu;
int main()
{
    int t,i,j,n,cas,point,cc,c1,flag,pos;
    scanf("%d",&t);
    for(cas=1;cas<=t;cas++)
    {
        scanf("%d%I64d%I64d",&n,&m,&k);
        memset(a,0,sizeof(a));
        temp=k*(k+1)/2;
        for(i=0;i<n;i++)
        {
            scanf("%I64d",&a[i]);
        }
        sort(a,a+n);
        a[n]=INF;
        printf("Case #%d:\n",cas);
        if(a[0]>m)
        {
            printf("madan!\n");
            continue;
        }
        if(a[n-1]<=m)
        {
            printf("why am I so diao?\n");
            continue;
        }
        for(i=0;i<n;i++)
        {
            if(a[i]>m)
            {
                pos=i;shu=a[pos-1];
                break;
            }
        }
        pos--;
        flag=1;
        while(pos!=(n-1))
        {
            if(k==0||(shu+k)<a[pos+1]&&(pos+1)<n)
            {
                flag=0;
                break;
            }
             for(i=pos+1;a[i]<=(shu+k)&&i!=n;i++)//因为i!=n没加,a[n]=INF似乎没起到作用,纠结,没能够AC
             {

             }
             pos=i-1;
             shu=a[pos];
             if(k>0) k--;
        }
        if(flag)
        {
            printf("why am I so diao?\n");
        }
        else printf("madan!\n");
    }
}

 

posted on 2015-05-30 22:41  大树置林  阅读(189)  评论(0编辑  收藏  举报

导航