码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 2831 (贪心)

时间:2015-05-20 18:09:13      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

题目链接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 2831 (贪心)

标签:

原文地址:http://www.cnblogs.com/neopenx/p/4517712.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!