勇者鬥惡龍【JAVA算法實現】

題目描述

在你的王國裏有一條n個頭的惡龍,你希望僱一些騎士把它殺死(即砍掉所有頭)。村裏有m個騎士可以僱傭,一個能力值爲m的騎士可以砍掉一個直徑不超過x的頭,且需要支付x個金幣。如何僱傭騎士才能砍掉惡龍的所有頭,且需要支付的金幣最少?注意,一個騎士只能砍一個頭(且不能被僱傭兩次)。

輸入格式

輸入包含多組數據。每組數據的第一行爲正整數m和n(1<=m,n<=20 000);以下m行每行爲一個整數,即惡龍每個頭的直徑;以下n行每行爲一個整數,即每個騎士的能力。輸入結束標誌爲m=n=0。

輸出格式

對於每組數據,輸出最少花費。如果無解,輸出"Loowater is doomed!"。

樣例輸入

2 3
5
4

8
4
2 1
5
5
10
0 0

樣例輸出

11
Loowater 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);
		}
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章