【输入格式】
输入包含多组数据。每组数据的第一行为正整数n和m(1≤n,m≤20 000);以下n行每行为一个整数,即恶龙每个头的直径;以下m行每行为一个整数,即每个骑士的能力。输入结束标志为n=m=0。
【输出格式】
对于每组数据,输出最少花费。如果无解,输出“Loowater isdoomed!”。
【样例输入】
2 3
5
4
7
8
4
2 1
5
5
10
0 0
【样例输出】
11
Loowater is doomed!
【分析】:方法:排序+贪婪
【数据结构】:两个一维数组
【java实现】:
/**
* status: Accepted
*
* @author wutong
*/
import java.util.Arrays;
import java.util.Scanner;
public class Main01
{
static int maxn = 2000+5;
int[] a = new int[maxn];
int[] b = new int[maxn];
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
String s = "Loowater is doomed!";
while(in.hasNext())
{
int a = in.nextInt();
int b = in.nextInt();
if(a == 0 &&b == 0)
{
break;
}
int[] x = new int[a];
int[] y = new int[b];
for(int i = 0;i<a;i++)//用于存放恶龙头的尺寸
{
x[i] = in.nextInt();
}
for(int i = 0;i<b;i++)//用于存放勇者的能力值
{
y[i] = in.nextInt();
}
if(a > b)
{
System.out.println(s);
}
else
{
Arrays.sort(x);//排序
Arrays.sort(y);//排序
int cur = 0;//当前需要砍得头
int num = 0;//总花费
for(int i = 0;i < b;i++)//最好不要用while循环,容易出错导致超时
{
if(x[cur] <= y[i])
{
cur++;
num = num+y[i];
}
else
{
continue;
}
if(cur == a)
{
break;
}
}
if(a == cur)//判断标志:砍掉的头数等于总的头数
{
System.out.println(num);
}
else
{
System.out.println(s);
}
}
}
in.close();
}
}