HDU4415 Assassin’s Creed
题目大意:有n个人,每个人有x,y两个值。x代表干掉他得到的分数,分数和不超过m;y代表干掉他后你能额外干掉多少个,且不计入总分。
求干掉人数最多为多少,以及最小的分。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
考试最后40分钟想出正解贪心,思路太乱没时间码导致20。
直接说正解:优雅的贪心
如果将y为0的放入a集,其余放入b集,那么正解只能有两种情况:
1.只从a中拿。
2.拿走全部的b,剩下将b从小到大排序后去掉最小,然后将b并入a中,再从a中拿。
为什么是这样的?
首先我们可以知道,只要拿走一个b,可以带出全部的b。
这样的话可以想象将bi建成一棵树:
b1->b2->b3
\
>b4->b5
\
>b6
假设它是一棵树
假设干掉b2要100块钱,还有一个a2要200块钱。
这样我们可以先干掉b2,花100,然后b1就少了一个儿子,在把a2放进去,就是:
b2->b3
b1->a2
\
>b4->b5
\
>b6
这样就是花100块钱干掉a2了。
我们还发现,b1是不能被置换的,因为它没有父亲。
所以正解:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 100050
#define ll long long
int T,n,ac,bc;
ll ax[N],bx[N],by[N],m;
bool cmp(ll x,ll y)
{
return x<y;
}
int cs;
int main()
{
scanf("%d",&T);
while(T--)
{
cs++;
printf("Case %d: ",cs);
scanf("%d%I64d",&n,&m);
ll sy = ;
ac=bc=;
for(int i=;i<=n;i++)
{
bc++;
scanf("%I64d%I64d",&bx[bc],&by[bc]);
if(!by[bc])
{
ax[++ac]=bx[bc];
bc--;
continue;
}
sy+=by[bc];
}
sort(ax+,ax++ac,cmp);
ll ans1 = ;
ll ans2 = ;
for(int i=;i<=ac;i++)
{
if(ans2+ax[i]<=m)
{
ans1++;
ans2+=ax[i];
}else
{
break;
}
}
if(!bc)
{
printf("%I64d %I64d\n",ans1,ans2);
continue;
}
sort(bx+,bx++bc,cmp);
ll ans3 = sy;
ll ans4 = bx[];
if(ans4>m)
{
printf("%I64d %I64d\n",ans1,ans2);
continue;
}
for(int i=;i<=bc;i++)
{
ax[++ac] = bx[i];
}
sort(ax+,ax++ac,cmp);
for(int i=;i<=ac;i++)
{
if(ans3>=n)
{
ans3=n;
break;
}
if(ans4+ax[i]<=m)
{
ans3++;
ans4+=ax[i];
}
}
if(ans1>ans3||(ans1==ans3&&ans2<ans4))printf("%I64d %I64d\n",ans1,ans2);
else printf("%I64d %I64d\n",ans3,ans4);
}
return ;
}
HDU4415 Assassin’s Creed的更多相关文章
- ACM学习历程—HDU4415 Assassin’s Creed(贪心)
Problem Description Ezio Auditore is a great master as an assassin. Now he has prowled in the enemie ...
- HDU-4415 Assassin’s Creed 贪心
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4415 用贪心来解,开始分为两个集合的方法错了,没有考虑之间的相互影响,正确的姿势应该是这样的,分两种情 ...
- Light OJ 1429 Assassin`s Creed (II) BFS+缩点+最小路径覆盖
题目来源:Light OJ 1429 Assassin`s Creed (II) 题意:最少几个人走全然图 能够反复走 有向图 思路:假设是DAG图而且每一个点不能反复走 那么就是裸的最小路径覆盖 如 ...
- Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖
标题来源:problem=1406">Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路: ...
- Light OJ 1406 Assassin`s Creed 状态压缩DP+强连通缩点+最小路径覆盖
题目来源:Light OJ 1406 Assassin`s Creed 题意:有向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问题 ...
- HDU 4415 - Assassin’s Creed
Problem Description Ezio Auditore is a great master as an assassin. Now he has prowled in the enemie ...
- [GodLove]Wine93 Tarining Round #7
比赛链接: http://vjudge.net/contest/view.action?cid=47643#overview 比赛来源: 2012 ACM/ICPC Asia Regional Han ...
- 微软Nokia 222:可拍照可上网 售价37美元 32GB的microSD卡扩展
腾讯科技讯 8月27日,在几乎所有厂商都在智能手机领域大肆拼杀的时候,微软日前却悄悄地发布了一款功能手机Nokia 222. 目前,尽管全球许多发达国家的居民都对互联网已经再熟悉不过了,但事实上全球依 ...
- [ZZ] GTX 280 GPU architecture
http://anandtech.com/show/2549 Now that NVIDIA’s has announced its newest GPU architecture (the GeFo ...
随机推荐
- 比Android更深远的改变世界——谷歌开源人工智能系统TensorFlow文档中文版
OpenStack中国社区编者按:开源无处不在,特别在基础创新领域,未来系统软件都会是开源为主流:2015年11月9日,Google于开源了其第二代人工智能系统Tensorflow,如同6年前同样开源 ...
- linux文件名乱码时删除或改名的方式(转载)
转自:http://www.linuxsa.cn/when-linux-file-name-topsy-turvy-deleted-or-renamed.html linux文件名乱码时删除或改名的方 ...
- bzoj 1027: [JSOI2007]合金【凸包+Floyd】
参考:https://www.cnblogs.com/zhuohan123/p/3237246.html 因为一c可以由1-a-b得出,所以删掉c,把a,b抽象成二维平面上的点.首先考虑一个客户需求能 ...
- 洛谷P4114 Qtree1(树链剖分+线段树)
传送门 LCT秒天秒地用什么树剖 这题可以算是树剖的比较裸的题目了 把每一条边的权值下放到他两边的点中深度较深的那个 然后直接用树剖+线段树带进去乱搞就可以了 //minamoto #include& ...
- 11.Flask-钩子函数
在Flask中钩子函数是使用特定的装饰器的函数.为什么叫做钩子函数呢,是因为钩子函数可以在正常执行的代码中,插入一段自己想要执行的代码,那么这种函数就叫做钩子函数. before_first_requ ...
- 配置yum源的步骤(阿里源)
配置yum源的步骤1.可以移除默认的yum仓库,也就是删除 /etc/yum.repos.d/底下所有的.repo文件(踢出国外的yum源) 1.配置yum源,找到阿里云的官方镜像源地址 https: ...
- 事件模型的介绍与Button的ActionListener
事件监听: 这是个很重要的概念,也是个很重要的模型,vb,vc都是这样用,甚至后面学的web框架也在用. 现在我们可以做很多按钮了吧,但是我们的按钮按它是没反应的,现在我们来看看怎么样才能让它有 ...
- 转】Nodejs对MongoDB模糊查询
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/4/ 感谢! Posted: Jul 1, 2013 Tag ...
- CF919D Substring
思路: 拓扑排序过程中dp.若图有环,返回-1. 实现: #include <bits/stdc++.h> using namespace std; ; vector<int> ...
- CF915C Permute Digits
思路: 从左到右贪心放置数字,要注意判断这个数字能否放置在当前位. 实现: #include <bits/stdc++.h> using namespace std; typedef lo ...