HDU 2831 (贪心)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2831

题目大意:植物大战僵尸。给定种植植物时间间隔t,以及每个僵尸的到达时间v,生命d。问是否能赢。

解题思路

按照打完每只Zombie之后剩余时间v-d,从小到大排序。

理由如下:

设打完第i只Zombie的剩余时间为:$Remain(v,d)=V-i*t-D$

那么本题的目标函数为:$arg\max \limits_{i}\sum Remain(v,d)=V-i*t-D$

所以,应当尽可能把v-d较小的值放在i的前面,让Remain(v,d)尽可能大。

排序完之后,进行模拟,now=0,当前时间为0

从第1只Zombie算起,now+=t:

$if \quad Attack Time<D \quad then\quad GameOver$

注意,不可以取等,样例说明,正好到达位置被打死也会GameOver。

#include "cstdio"

#include "algorithm"

using namespace std;

struct Zombie

{

    int v,d,idx;

    bool operator < (const Zombie &a) const {return v-d<a.v-a.d;}

}z[105];

int main()

{

    //freopen("in.txt","r",stdin);

    int n,t;

    while(scanf("%d%d",&n,&t)!=EOF)

    {

        for(int i=0;i<n;i++) scanf("%d%d",&z[i].v,&z[i].d),z[i].idx=i+1;

        sort(z,z+n);

        int now=0;

        bool flag=true;

        for(int i=0;i<n;i++)

        {

            now+=t;

            int ret=z[i].v-now;

            if(ret<z[i].d) {flag=false;break;}

        }

        if(flag)

        {

            for(int i=0;i<n-1;i++) printf("%d ",z[i].idx);

            printf("%d\n",z[n-1].idx);

        }

        else printf("The zombies eat your brains!\n");

    }

}

 

你可能感兴趣的:(HDU)