UVa11292
2016-05-23 17:11
239 查看
Problem: Dragon of Loowater
Description: 一个王国中有N个骑士,有M条恶龙。每个骑士都有一个属性X,代表着这个骑士可以砍掉一头直径不大于X的头的恶龙,并且花费X金币。现在问你这些骑士能不能把所有恶龙的头都砍掉,如果能,那么最低要花费多少钱雇佣他们。
Solution: 看到这个题我们肯定会有一个直觉。那就是让骑士去砍他能砍的头最大的恶龙。恶龙肯定是要都砍完的,那么我们就对恶龙排序,从最小的开始砍。现在问题来了,派谁去砍最小的,当然是派花费最小的去砍。如果他砍不掉就换花费第二小的。这样,就能保证花费最小,并且可能的话,恶龙都会被砍掉。要排两次序。
Code(C++):
Description: 一个王国中有N个骑士,有M条恶龙。每个骑士都有一个属性X,代表着这个骑士可以砍掉一头直径不大于X的头的恶龙,并且花费X金币。现在问你这些骑士能不能把所有恶龙的头都砍掉,如果能,那么最低要花费多少钱雇佣他们。
Solution: 看到这个题我们肯定会有一个直觉。那就是让骑士去砍他能砍的头最大的恶龙。恶龙肯定是要都砍完的,那么我们就对恶龙排序,从最小的开始砍。现在问题来了,派谁去砍最小的,当然是派花费最小的去砍。如果他砍不掉就换花费第二小的。这样,就能保证花费最小,并且可能的话,恶龙都会被砍掉。要排两次序。
Code(C++):
#include <stdio.h> #include <string.h> #include <stdlib.h> const int M=20000+5; int n,m; int dragon[M]; int soilder[M]; int cmp(const void *a,const void *b) { return *((int *)a)-*((int *)b); } int main() { while(scanf("%d%d",&n,&m),!(!n&&!m)){ for(int i=0;i<n;i++) scanf("%d",&dragon[i]); for(int i=0;i<m;i++) scanf("%d",&soilder[i]); qsort(dragon,n,sizeof(dragon[0]),cmp); qsort(soilder,m,sizeof(soilder[0]),cmp); int ans=0; int cnt=0; for(int i=0;i<m;i++){ if(soilder[i]>=dragon[cnt]) ans+=soilder[i],++cnt; if(cnt==n) break; } if(cnt==n) printf("%d\n",ans); else puts("Loowater is doomed!"); } return 0; }
相关文章推荐
- 用RadASM开发窗口程序(2)
- 开源RefreshListView下拉刷新效果
- 命令行 gif
- ASP.NET中website与webApplication有何区别?
- ISE12.1编译ModelSim10.1a库的版本识别问题及解决
- 人力资源管理七大问题
- Android获取SD卡总容量,可用大小,机身内存总容量及可用大小的系统方法
- SNMP4J教程
- MYSQL 解压版5.7.12安装和客户端连接。
- CPU 突然使用过高
- 单例模式的八种写法
- 寒假考试的T2 树
- 浅尝Node文件系统
- Huffman树编码与解码
- xcode7 亲测 本地化或者国际化 方法实践
- leetcode 231 Power of Two C++
- js 计算精度问题
- 关于Backtracing中有重复元素的处理办法
- handlebars添加条件判断
- 阿里研究员华先胜:图像搜索的前世今生