题目链接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[];
int main()
{
//freopen("in.txt","r",stdin);
int n,t;
while(scanf("%d%d",&n,&t)!=EOF)
{
for(int i=;i<n;i++) scanf("%d%d",&z[i].v,&z[i].d),z[i].idx=i+;
sort(z,z+n);
int now=;
bool flag=true;
for(int i=;i<n;i++)
{
now+=t;
int ret=z[i].v-now;
if(ret<z[i].d) {flag=false;break;}
}
if(flag)
{
for(int i=;i<n-;i++) printf("%d ",z[i].idx);
printf("%d\n",z[n-].idx);
}
else printf("The zombies eat your brains!\n");
}
}

最新文章

  1. Microsoft dotnetConf 2015 一些整理
  2. 通过Map 3D API读取线状要素的节点坐标
  3. int转string
  4. 【Binary Tree Post order Traversal】cpp
  5. poj 1719 Shooting Contest
  6. web 分类 和使用Dreamweaver
  7. PHP之preg_replace()与ereg_replace()正则匹配比较讲解
  8. Java循环语句 while
  9. android-support-v7-appcompat下载
  10. 算法入门经典大赛 Dynamic Programming
  11. 采用Eclipse中间Maven构建Web项目错误(一)
  12. repo 和git的用法
  13. 树莓派raspberry pi配置无线路由器AP
  14. uva11388
  15. 【转】Java中static关键字用法总结
  16. wewqe
  17. 【DM】The PageRank Citation Ranking: Bringing Order to the Web - PageRank引用排名:将订单带到Web上
  18. Python3基础 list reversed 列表逆转并输出
  19. win7上搭建Android环境及调试
  20. jsoncpp在Windows和Linux下的安装

热门文章

  1. Smarty模板技术学习
  2. mysql常用表/视图管理语句
  3. 【PHP对XML文件的操作技术【完整版】】
  4. SVN-简要说明
  5. hdu 5000 dp **
  6. struct和typedef struct
  7. 解决linux下unzip中文有乱码的问题
  8. jquery audio player
  9. 函数调用关于从Ring3转到Ring0 ESP堆栈变化
  10. Java利用Preferences设置个人偏好