题意:你需要雇佣m个骑士去杀死一个有n个头的龙,每个骑士有一个能力值x。能力值为x的骑士可以砍掉一个直径<=x的头,且需要花费x去雇佣。每个骑士最多只能被雇用一次。求杀死龙的最小花费。
典型贪心。将龙头的直径和骑士的能力值分别从小到大排序,从小到大砍龙头。贪心准则是每一个龙头用拥有最接近它直径的能力值的骑士去杀。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
const int MAX = 20005;
int n, m;
int dragon[MAX], knight[MAX];
void input()
{
for(int i = 0; i < n; i++)
scanf("%d", &dragon[i]);
for(int i = 0; i < m; i++)
scanf("%d", &knight[i]);
}
void solve()
{
sort(dragon, dragon + n);
sort(knight, knight + m);
int j = 0;
int ans = 0;
for(int i = 0; i < n; i++)
{
while(j < m && knight[j] < dragon[i])
j++;
if(j == m)
{
printf("Loowater is doomed!\n");
return;
}
ans += knight[j];
j++;
}
printf("%d\n", ans);
}
int main()
{
while(scanf("%d%d", &n, &m) && !(n == 0 && m == 0))
{
input();
solve();
}
return 0;
}