hdu4415 不错的想法题
题意:
一个人他有一定的血,有一些怪物,他去杀怪物,有的怪物杀死他后还可以在不费自己血的情况下任意杀死一些怪物,问你他最多杀死多少怪物,在最多杀怪前提下最好用多少血,(大体题意是这样).
思路:
首先我们把怪物分成两个集合,A一个是杀死他后可以免费杀死其他人的,B另一个是杀死他后不能免费杀死其他人的,分析下我们会发现,A集合我们只要杀死其中一个人就可以免费杀死其他人(肯定杀费血最少的),而且很有可能会攒下一些杀死B集合的机会.
其实无非两种情况,杀A集合的和不杀A集合的,如果杀选择杀A集合的那么我们肯定全杀掉,而花费的血就是A集合中血最少的那个,然后我们再把出了刚刚杀的那个以外,和B集合的所有放在一起排序称为C,杀完A集合后会剩下一下免费杀人的机会,我们用这些机会去杀C中的人,既然是免费的肯定从最大的开始杀,杀完后如果没杀没的话我们就用自己的血从小的开始在接着杀,一直杀到自己血没活着敌人没了未知,这是第一种情况,第二种情况是不杀A集合的,只杀B集合的,这种好办,直接把B排序一便,从小的开始能杀多少杀多少,最后在两种方案中选择一个最优的输出来就行了...
/*
1 只杀bi为0的 ,排序下,直接杀就行了;
2 杀bi不为0的 ,先杀死最小的那个bi不为0的,然后得到 s = b1 + b2 + b3 +++
然后在杀死其余的 n1 + n2 - 1 - s 的怪,就ok了;
*/
#include<stdio.h>
#include<algorithm>
#define N 100000 + 100
using namespace std;
typedef struct
{
int xp ,hp;
}NODE;
NODE node1[N] ,node2[N];
bool camp(NODE a ,NODE b)
{
return a.hp < b.hp;
}
int main ()
{
int t ,i ,n ,v ,n1 ,n2;
int ans1_n ,ans2_n ,ans1_hp ,ans2_hp;
int cas = 1 ,s;
scanf("%d" ,&t);
while(t--)
{
scanf("%d %d" ,&n ,&v);
n1 = n2 = s = 0;
NODE temp;
for(i = 1 ;i <= n ;i ++)
{
scanf("%d %d" ,&temp.hp ,&temp.xp);
if(temp.xp)
{
node2[++n2] = temp;
s += temp.xp;
}
else
node1[++n1] = temp;
}
ans1_n = ans1_hp = 0;
sort(node1 + 1 ,node1 + n1 + 1 ,camp);
int vv = v;
for(i = 1 ;i <= n1 ;i ++)
{
if(vv < node1[i].hp) break;
ans1_n ++;
ans1_hp += node1[i].hp;
vv -= node1[i].hp;
}
sort(node2 + 1 ,node2 + n2 + 1 ,camp);
if(v < node2[1].hp)
{
printf("Case %d: %d %d\n" ,cas ++ ,ans1_n ,ans1_hp);
continue;
}
ans2_n = 1;
ans2_hp = node2[1].hp;
v -= node2[1].hp;
if(s >= n1 + n2 - 1)
{
ans2_n = n1 + n2;
if(ans1_n > ans2_n || ans1_n == ans2_n && ans1_hp < ans2_hp)
printf("Case %d: %d %d\n" ,cas ++ ,ans1_n ,ans1_hp);
else
printf("Case %d: %d %d\n" ,cas ++ ,ans2_n ,ans2_hp);
continue;
}
for(i = 2 ;i <= n2 ;i ++)
node1[++n1] = node2[i];
sort(node1 + 1 ,node1 + n1 + 1 ,camp);
n1 -= s;
vv = v;
ans2_n += s;
for(i = 1 ;i <= n1 ;i ++)
{
if(vv < node1[i].hp) break;
vv -= node1[i].hp;
ans2_n ++;
ans2_hp += node1[i].hp;
}
if(ans1_n > ans2_n || ans1_n == ans2_n && ans1_hp < ans2_hp)
printf("Case %d: %d %d\n" ,cas ++ ,ans1_n ,ans1_hp);
else
printf("Case %d: %d %d\n" ,cas ++ ,ans2_n ,ans2_hp);
}
return 0;
}
hdu4415 不错的想法题的更多相关文章
- HDU 4972 Bisharp and Charizard 想法题
Bisharp and Charizard Time Limit: 1 Sec Memory Limit: 256 MB Description Dragon is watching NBA. He ...
- CodeForces 111B - Petya and Divisors 统计..想法题
找每个数的约数(暴力就够了...1~x^0.5)....看这约数的倍数最后是哪个数...若距离大于了y..统计++...然后将这个约数的最后倍数赋值为当前位置...好叼的想法题.... Program ...
- HDU - 5806 NanoApe Loves Sequence Ⅱ 想法题
http://acm.hdu.edu.cn/showproblem.php?pid=5806 题意:给你一个n元素序列,求第k大的数大于等于m的子序列的个数. 题解:题目要求很奇怪,很多头绪但写不出, ...
- hdu 5063 不错的小想法题(逆向处理操作)
题意: 刚开始的时候给你一个序列,长度为n,分别为a[1]=1,a[2]=2,a[3]=3,a[4]=4...a[n]=n,然后有4种操作如下: Type1: O 1 call fun1( ...
- HDU - 5969 最大的位或 想法题
http://acm.hdu.edu.cn/showproblem.php?pid=5969 (合肥)区域赛签到题...orz 题意:给你l,r,求x|y的max,x,y满足l<=x<=y ...
- hdu3006 状态压缩+位运算+hash(小想法题)
题意: 给了n个集合,问你这n个集合可以组合出多少种集合,可以自己,也可以两个,也可以三个....也可以n个集合组在一起. 思路: 是个小想法题目,要用到二进制压缩,位运算, ...
- poj1852 Ants ——想法题、水题
求最短时间和最长时间. 当两个蚂蚁相遇的时候,可以看做两个蚂蚁穿过,对结果没有影响.O(N)的复杂度 c++版: #include <cstdio> #define min(a, b) ( ...
- HDU 4193 Non-negative Partial Sums(想法题,单调队列)
HDU 4193 题意:给n个数字组成的序列(n <= 10^6).求该序列的循环同构序列中,有多少个序列的随意前i项和均大于或等于0. 思路: 这题看到数据规模认为仅仅能用最多O(nlogn) ...
- CodeForces - 156B Suspects 逻辑 线性 想法 题
题意:有1~N,n(1e5)个嫌疑人,有m个人说真话,每个人的陈述都形如X是凶手,或X不是凶手.现在给出n,m及n个陈述(以+x/-X表示)要求输出每个人说的话是true ,false or notd ...
随机推荐
- Ubuntu的点滴-Vim、VM Tools、Samba、换源
<div id="article_content" class="article_content clearfix"> <link rel=& ...
- E: Some index files failed to download. They have been**
转: E: Some index files failed to download. They have been** 问题描述: 当使用Dockerfile从包含cuda的镜像建立新的image的时 ...
- HDOJ-2087(KMP算法)
剪花布条 HDOJ-2087 本题和hdoj-1686相似,唯一不同的是这里的子串一定要是单独的.所以在确定有多少个子串时不能用前面的方法.而是在循环时,只要找到一个子串,i就不是++,而是+=子串的 ...
- CCF(再卖菜60分)爆搜+记忆化搜索+差分约束
201809-4 再卖菜 我使用的是爆搜解决,只得了60分. 记忆化搜索 差分约束 #include<iostream> #include<cstdio> #include&l ...
- 一个把数据转化成Excel导出的程序 python Django
把从数据库查询出来数据导出 源码下载!!!!! 效果图 登入界面 主页面 查询到数据 导出 打开得到文件 项目地址,源码下载
- CVE-2017-12149-JBoss 5.x/6.x 反序列化
漏洞分析 https://www.freebuf.com/vuls/165060.html 漏洞原理 该漏洞位于JBoss的HttpInvoker组件中的 ReadOnlyAccessFilter 过 ...
- linux 设置DNS解决,不能ping 域名的问题
vi /etc/resolv.conf nameserver 114.114.114.114
- rest-framework routers
路由器 资源路由可以让你快速声明所有给定的足智多谋的控制器的共同路线.相反,宣布独立的路线索引的......一个足智多谋的路线宣称他们在一个单一的代码行. - Ruby on Rails的文档 一些W ...
- MyBatis(一):JDBC使用存在的问题
JDBC使用步骤: a:加载 JDBC 驱动程序 b:创建数据库的连接对象Connection c:根据链接获取Statement d:拼接SQL语句及设置参数 e:执行SQL并获取结果集 f:关闭使 ...
- validator库参数校验
目录 validator库参数校验若干实用技巧 基本示例 翻译校验错误提示信息 自定义错误提示信息的字段名 自定义结构体校验方法 自定义字段校验方法 自定义翻译方法 validator库参数校验若干实 ...