題目描述
在你的王國裏有一條n個頭的惡龍,你希望僱一些騎士把它殺死(即砍掉所有頭)。村裏有m個騎士可以僱傭,一個能力值爲m的騎士可以砍掉一個直徑不超過x的頭,且需要支付x個金幣。如何僱傭騎士才能砍掉惡龍的所有頭,且需要支付的金幣最少?注意,一個騎士只能砍一個頭(且不能被僱傭兩次)。輸入格式
輸入包含多組數據。每組數據的第一行爲正整數m和n(1<=m,n<=20 000);以下m行每行爲一個整數,即惡龍每個頭的直徑;以下n行每行爲一個整數,即每個騎士的能力。輸入結束標誌爲m=n=0。輸出格式
對於每組數據,輸出最少花費。如果無解,輸出"Loowater is doomed!"。樣例輸入
2 35
4
7
8
4
2 1
5
5
10
0 0
樣例輸出
11Loowater is doomed!
分析
能力高的其實開價高是合理的,但是如果你派去砍一個很弱的頭,那就是浪費人才了。因此,可以把僱來的騎士按照能力從小到大排序,一個一個砍就可以了。不能砍掉當前需要砍的頭的騎士就不要僱傭了。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String arg[]) {
final int maxn = 20000 + 5;
int[] A = new int[maxn];
int[] B = new int[maxn];
Scanner cin = new Scanner(System.in);
while (cin.hasNext()) {
int n = cin.nextInt(), m = cin.nextInt();
if(n==0&&m==0)return;
for (int i = 0; i < n; i++)
A[i] = cin.nextInt();
for (int i = 0; i < m; i++)
B[i] = cin.nextInt();
Arrays.sort(A, 0, n);
Arrays.sort(B, 0, m);
/*
* public static void sort(int[] a, int fromIndex, int toIndex)
* 對指定 int 型數組的指定範圍按數字升序進行排序。排序的範圍從索引 fromIndex(包括)一直到索引 toIndex(不包括)。
* (如果 fromIndex==toIndex,則排序範圍爲空。)
*/
int cost = 0, num = 0;
for (int i = 0; i < m; i++) {
if (A[num] <= B[i])
cost += B[i];
if (++num == n)
break;
}
if (num < n)
System.out.println("Loowater is doomed!");
else
System.out.println(cost);
}
}
}