ACM学习历程—HDU4415 Assassin’s Creed(贪心)
Problem Description
Ezio Auditore is a great master as an assassin. Now he has prowled in the enemies’ base successfully. He finds that the only weapon he can use is his cuff sword and the sword has durability m. There are n enemies he wants to kill and killing each enemy needs Ai durability. Every time Ezio kills an enemy he can use the enemy’s sword to kill any other Bi enemies without wasting his cuff sword’s durability. Then the enemy’s sword will break. As a master, Ezio always want to do things perfectly. He decides to kill as many enemies as he can using the minimum durability cost.
Input
The first line contains an integer T, the number of test cases.
For each test case:
The first line contains two integers, above mentioned n and m
(1<=n<=10^5, 1<=m<=10^9).
Next n lines, each line contains two integers Ai, Bi. (0<=Ai<=10^9,
0<=Bi<=10).
Output
For each case, output "Case X: "
(X is the case number starting from 1) followed by the number of the enemies
Ezio can kill and the minimum durability cost.
Sample
Input
2
3 5
4 1
5 1
7 7
2 1
2 2
4 0
Sample
Output
Case 1:
3 4
Case 2: 0 0
题目大意是用m点耐久度去杀人,杀死一个人需要Ai耐久度,但是可以额外再杀死Bi个人。
题目要求的首先是杀人最多,其次是消耗耐久度最少。
首先会想到对人进行分类,一类是B为0的,一类是B不为0的。
因为杀死一个B不为0的,一定能杀死所有B不为0的,而且还能再额外杀死B为0的。
于是就先分出第一种情况:不杀B不为0的人;
这样就是对B为0的人进行贪心,优先杀消耗耐久度最小的即可。
考虑第二种情况:杀死至少一个B不为0的人。
那么首先前提自然是保证能杀死B不为0的人里面消耗耐久度最少的。
然后就可以杀死所有B不为0的人。而且还能再额外杀死B为0的。
最后就是用剩余耐久度去杀死剩下的B为0的人。
但是这样会出现一种情况。就是虽然B不为0的人,可以自动杀死,但是如果我手动杀死一个B不为0的人,可以多出一个名额杀死一个B为0的人。但是也许这样我会消耗更低的耐久度去手动杀死一个人。
于是就发现,肯定可以杀死所有B不为0的人,但是可以优先手动杀死耐久度小的。
得出结论:杀死第一个耐久度最小的B不为0的人后,我便按照耐久度从小到大手动杀人。
此处还要注意的是,我依次杀人后,如果剩下的人都能被自动杀死,我便不需要再手动杀死人了。
最后就是两种情况取最值了。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#include <utility>
#include <queue>
#include <vector>
#define LL long long using namespace std; typedef pair<int, int> pii;
const int maxN = 1e5+;
int n, m;
struct node
{
int need;
int kill;
}p[][maxN];
int top[];
int can; bool cmpNeedLest(node x, node y)
{
return x.need < y.need;
} void input()
{
scanf("%d%d", &n, &m);
can = ;
top[] = top[] = ;
int need, kill;
for (int i = ; i < n; ++i)
{
scanf("%d%d", &need, &kill);
if (kill == )
{
p[][top[]].need = need;
p[][top[]].kill = ;
top[]++;
}
else
{
p[][top[]].need = need;
p[][top[]].kill = kill;
top[]++;
can += kill;
}
}
sort(p[], p[]+top[], cmpNeedLest);
sort(p[], p[]+top[], cmpNeedLest);
} pii workOne()
{
//p->p+top;
int num = , rest = m;
for (int i = ; i < top[]; ++i)
{
if (rest >= p[][i].need)
{
num++;
rest -= p[][i].need;
}
else
break;
}
return pii(num, m-rest);
} pii workTwo()
{
int rest = m, num = ;
int from[];
from[] = from[] = ;
if (top[] == || rest < p[][].need)
return pii(, );
rest -= p[][].need;
from[]++;
bool flag;
for (;;)
{
if (n-(from[]+from[]) <= can)
break;
flag = false;
if (from[] < top[] && p[][from[]].need > p[][from[]].need)
{
if (rest >= p[][from[]].need)
{
flag = true;
rest -= p[][from[]].need;
from[]++;
num++;
}
}
else if (from[] < top[])
{
if (rest >= p[][from[]].need)
{
flag = true;
rest -= p[][from[]].need;
from[]++;
num++;
}
}
if (!flag)
break;
}
return pii(min(from[]+from[]+can, n), m-rest);
} void work()
{
pii one, two;
one = workOne();
two = workTwo();
if (one.first > two.first)
printf("%d %d\n", one.first, one.second);
else if (one.first == two.first)
printf("%d %d\n", one.first, min(one.second, two.second));
else
printf("%d %d\n", two.first, two.second);
} int main()
{
//freopen("test.in", "r", stdin);
int T;
scanf("%d", &T);
for (int times = ; times <= T; ++times)
{
input();
printf("Case %d: ", times);
work();
}
return ;
}
ACM学习历程—HDU4415 Assassin’s Creed(贪心)的更多相关文章
- HDU-4415 Assassin’s Creed 贪心
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4415 用贪心来解,开始分为两个集合的方法错了,没有考虑之间的相互影响,正确的姿势应该是这样的,分两种情 ...
- ACM学习历程——NOJ1113 Game I(贪心 || 线段树)
Description 尼克发明了这样一个游戏:在一个坐标轴上,有一些圆,这些圆的圆心都在x轴上,现在给定一个x轴上的点,保证该点没有在这些圆内(以及圆上),尼克可以以这个点为圆心做任意大小的圆,他想 ...
- ACM学习历程—HDU5422 Rikka with Graph(贪心)
Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...
- ACM学习历程—CSU 1216 异或最大值(xor && 贪心 && 字典树)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1216 题目大意是给了n个数,然后取出两个数,使得xor值最大. 首先暴力枚举是C(n, ...
- ACM学习历程—HihoCoder1309任务分配(排序 && 贪心)
http://hihocoder.com/problemset/problem/1309 题目大意是给定n个任务的起始时间,求问最少需要多少台机器. 有一个贪心的策略就是,如果说对于一个任务结束,必然 ...
- ACM学习历程—FZU 2144 Shooting Game(计算几何 && 贪心 && 排序)
Description Fat brother and Maze are playing a kind of special (hentai) game in the playground. (May ...
- ACM学习历程—HDU 4726 Kia's Calculation( 贪心&&计数排序)
DescriptionDoctor Ghee is teaching Kia how to calculate the sum of two integers. But Kia is so carel ...
- ACM学习历程——HDU 5014 Number Sequence (贪心)(2014西安网赛)
Description There is a special number sequence which has n+1 integers. For each number in sequence, ...
- ACM学习历程——POJ 1700 Crossing River(贪心)
Description A group of N people wishes to go across a river with only one boat, which can at most ca ...
随机推荐
- HDU-4031-Attack(树状数组)
Problem Description Today is the 10th Annual of "September 11 attacks", the Al Qaeda is ab ...
- json:js和jquery中轻量级数据交换格式
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族 ...
- 我的Android进阶之旅------>Android字符串资源中的单引号问题error: Apostrophe not preceded by 的解决办法
刚刚在string字符串资源文件中,写了一个单引号,报错了,错误代码如下 error: Apostrophe not preceded by \ (in OuyangPeng's blog ) 资源文 ...
- C# unicode GBK UTF-8和汉字互转
界面: 源码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Da ...
- DevExpress实用心得:XtraGridControl动态添加右键菜
在使用GridControl的时候经常需要添加右键菜单. 一般的做法是自己创建菜单项,然后注册GridView的Mouse-Click事件,然后Show出定义好的菜单. 但是涉及到一些单击事件会收到编 ...
- [原创]java WEB学习笔记08:HttpServletRequest & ServletRequest
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- 常用CSS设置
主要内容: 一.容器类 二.文本类 三.特效类 一.容器类 1.background-image:url('img/02.gif'); 设置背景图(可以是动态图) 2.background-col ...
- Luogu-4166 [SCOI2007]最大土地面积
求平面内四边形的最大面积 显然四个端点都应该在凸包上,就先求凸包,然后\(n^2\)枚举四边形对角线,对于一个点\(i\),顺序枚举\(j\),同时用旋转卡壳的方法去找离对角线最远的两个点.总时间复杂 ...
- Idea 添加完项目以后自动生成的web.xml报错 'org.springframework.web.servlet.DispatcherServlet' is not assignable to 'javax.servlet.Servlet
解决方法:Project Structure - Modules - 你的项目 - Dependencies 添加Tomcat library
- something important
docker run ubuntu /bin/echo 'Hello world' 运行这条命令,docker做了什么 Well, Docker containers only run as long ...