第一篇博客,最近在学算法,准备奋斗ACM

来源:互联网 发布:mac桌面快捷键 编辑:程序博客网 时间:2024/06/08 19:39

偷笑比较常见的一道题,勇者斗恶龙的题目,自己写出的算法,觉得一般般吧

题目如下:

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


输入格式:输入包含多组数据。每组数据的第一行为正整数n和m(1<=n,m<=20000);以下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 <algorithm>
using namespace std;
int main()
{
int n[1000],m[1000];
int a,b,i,j;
int sum,cur=0;
cin>>a;
cin>>b;
if(a==0||b==0)
{
exit(0);
}
for(i=0;i<a;i++)
{
cin>>n[i];
}
for(j=0;j<b;j++)
{
cin>>m[j];
}
sort(n,n+a);
sort(m,m+b);//sort自动排序
if(b>=a)//判断龙的个数少于战士的个数才可以进行战斗,否则无意义
{
sum=0;
for(i=0;i<a;i++)
{
for(j=0;j<b;j++)
{
if(m[j]>=n[i])
{
    sum+=m[j];//统计金额
cur++;//统计每次砍完龙头的编号
break;
}
//cout<<"!!!!!!!!"<<m[j]<<"\t"<<n[i]<<endl;
}
}
if(cur<a)//假如砍完龙头的编号次数少于龙的数量则直接输出Loowater is doomed!
{
cout<<"Loowater is doomed!";
}
else
{
  cout<<sum<<endl;
}
}
else 
{
cout<<"Loowater is doomed!";
}
return 0;
}


0 0