UVa11292_The Dragon of Loowater[java]

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

【输入格式】

输入包含多组数据。每组数据的第一行为正整数nm(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 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();
	}
}



你可能感兴趣的:(ACM)