勇者鬥惡龍(uva11292)
阿新 • • 發佈:2018-12-06
勇者鬥惡龍(The Dragon of Loowater, UVa 11292)
你的王國裡有一條n個頭的惡龍,你希望僱一些騎士把它殺死(即砍掉所有頭)。村裡有m個騎士可以僱傭,一個能力值為x的騎士可以砍掉惡龍一個直徑不超過x的頭,且需要支付x個金幣。如何僱傭騎士才能砍掉惡龍的所有頭,且需要支付的金幣最少?注意,一個騎士只能砍一個頭(且不能被僱傭兩次)。
【輸入格式】
輸入包含多組資料。每組資料的第一行為正整數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!
思路:
砍得頭越多的騎士價格越貴,那麼我們就不能浪費,一個c=b[i]-a[i],這個c應該要大於0但是要足夠小,所以我們進行排序依次匹配就行了
#include<iostream> #include<algorithm> #include<stdio.h> using namespace std; #define MAX 20005 int a[MAX]; int b[MAX]; int main(){ int n ,m ; while(cin>>n>>m){ if(n == 0 && m == 0) break; for( int i = 0 ; i < n ; i++ ) cin>>a[i]; for( int j = 0 ; j < m ; j++ ) cin>>b[j]; sort(a,a+n); sort(b,b+m); int cur = 0 ; int cost = 0 ; for( int i = 0 ; i < m ; i++ ){ if(b[i] >= a[cur] ){ cost += b[i]; cur++; if(cur == n) break; } } if(cur < n) printf("Loowater is doomed!\n"); else printf("%d\n",cost); } return 0; } ``