18118 勇者斗恶龙
时间限制:1000MS 代码长度限制:10KB
题型: 编程题 语言: G++;GCC;VC
Description
有n个头的恶龙,你希望雇一些骑士把它杀死(即砍掉所有头)。 村里有m个骑士可以雇佣,一个能力值为x的骑士可以砍掉恶龙一个直径不超过x的头,且需要支付x个金币。如何雇佣骑士才能砍掉恶龙的所有头,且需要支付的金币最少? 注意,一个骑士只能砍一个头(且不能被雇佣两次)。
输入格式
多组数据,每组数据的第一行为正整数n和m(1<=n,m<=200000); 以下n行每行为一个整数,即恶龙每个头的直径; 以下m行每行为一个整数,即每个骑士的能力。 输入结束标志n=m=0;
输出格式
输出格式:每组数据,输出最少花费,无解输出"Loowater is doomed!"
输入样例
2 3 5 4 7 8 4 2 1 5 5 10 0 0
输出样例
11 Loowater is doomed!
问题分析:
使用优先队列,调整为递增排序。
将恶龙和勇者都递增排序后不断比较两者的最小值即可(找出能够砍下当前最小龙头的最便宜勇者)。
代码实现:
#include<iostream>
#include<queue>
#include<functional>//使用greater调整优先队列排序方式
using namespace std;
int main()
{
//多case
while(1)
{
//递增的优先队列
priority_queue<int,vector<int>,greater<int>>dragon,worrior;
int n,m;
cin>>n>>m;
//结束程序条件
if(n==0&&m==0)
return 0;
int temp=0,cnt=0;
//读入恶龙头的直径
while(n--)
{
cin>>temp;
dragon.push(temp);
}
//读入勇者能力(价格)
while(m--)
{
cin>>temp;
worrior.push(temp);
}
//恶龙没杀完,且还有勇者
while(!dragon.empty()&&!worrior.empty())
{
//因为恶龙和勇者都是递增排序,故可选出能力足够的最便宜勇者
if(dragon.top()<=worrior.top())
{
cnt+=worrior.top();
dragon.pop();
worrior.pop();
}
//当前最便宜勇者能力不足
else
{
worrior.pop();
}
}
//恶龙队列为空说明成功
if(dragon.empty())
{
cout<<cnt<<endl;
}
else
{
cout<<"Loowater is doomed!"<<endl;
}
}
return 0;
}