博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
勇者斗恶龙(The Dragon of Loowater,UVa 11292 )
阅读量:6620 次
发布时间:2019-06-25

本文共 1302 字,大约阅读时间需要 4 分钟。

勇者斗恶龙(The Dragon of Loowater,UVa 11292 )

你的王国里有一条n 个头的恶龙,你希望雇一些骑士把它杀死(即砍掉所有头)。村里有m 个骑士可以雇佣,一个能力值为x 的骑士可以砍掉恶龙一个直径不超过x 的头,且需要支付x 个金币。如何雇佣骑士才能砍掉恶龙的所有头,且需要支付的金币最少? 注意,个骑士只能砍一个头(且不能被雇佣两次)。

[输入格式]

输入包含多组数据。每组数据的第一行为正整数n和m (1<=n,m<=20000) ,以下n行,每行为一个整数,即恶龙每个头的直径; 以下m 行每行为一个整数,即每个骑士的能力。输入结束标志为n=m=0.

[输出格式]

对于每组数据,输出最少花费。如果无解,输出“Lowterdod

Sample Input

2 3 5 4 7 8 4 2 1 5 5 10 0 0

Sample Output

11

Loowater is doomed!

[分析]

      能力强的骑士开价高是合理的,但如果被你派去砍一个很弱的头,就是浪费人才了。因此,可以把雇佣来的骑士按照能力从小到大排序,所有头按照直径从小到大排序,一个个砍就可以了。当然,不能砍掉“当前需要砍的头”的骑士就不要雇佣了。 

       从资金最少考虑  显然正确。若不这样做可能反而会砍不掉所有头。从小到大排序后,若B[i]能砍  B[i+1]能砍 显然用B[i],并且B[i+1]可能以后还有更大的发挥空间.

#include 
#include
using namespace std;const int maxn=20005;int A[maxn]; //恶龙头的直径int B[maxn]; //勇士的能力值int main(){ int n,m; // 恶龙头数,勇士个数 while(cin>>n>>m) { if(n==0&&m==0) break; for(int i=0;i
>A[i]; for(int i=0;i
>B[i]; sort(A,A+n); sort(B,B+m); int cur=0; //当前要砍头的编号 int cost=0; //当前总费用 for(int i=0;i
=A[cur]) //注意是 >= { cost+=B[i]; if(++cur==n) //cur指向下一个头,如果头已砍完,退出循环 break; } } if(cur

转载于:https://www.cnblogs.com/zhanyeye/p/9746114.html

你可能感兴趣的文章
Mono for Android 优势与劣势
查看>>
【C++】成员函数重载二元和一元运算符
查看>>
“移”步到位:一站式移动应用研发体系
查看>>
ASP.NET状缓存Cache的应用-提高数据库读取速度
查看>>
WPF技术触屏上的应用系列(六): 视觉冲击、超炫系统主界面、系统入口效果实现...
查看>>
linux命令之ldconfig
查看>>
Python获取两个日期之间的列表
查看>>
Http服务器如何在HTTP response中传送二进制图片
查看>>
Spring boot quartz的相关资源
查看>>
ORA-00838: Specified value of MEMORY_TARGET is too small(转)
查看>>
Shell之sed命令
查看>>
如何让你的传输更安全——NIO模式和BIO模式实现SSL协议通信
查看>>
【云计算的1024种玩法】使用 NAS 文件储存低价获得好磁盘性能
查看>>
Android Framework Boot Up Overview(Android系统框架启动流程概述)
查看>>
聊聊 iOS 开发
查看>>
人人都应该了解的信息简史
查看>>
linux c文件操作接口
查看>>
Struts1——ActionForward对象常用设置
查看>>
H.264学习笔记之一(层次结构,NAL,SPS)
查看>>
5G时代的无线宽带新技术
查看>>