UVA.11292 Dragon of Loowater (贪心)
题意分析
题干很长,废话很多。 (实在不懂那个图片是干啥)
现在要你屠龙,有n个头直径为dra[i]的龙,有m个最多能杀掉头直径为kni[i]的骑士(1<= i <=n)。你可去雇佣骑士来杀龙,每个其实的价格为kni[i],现在求屠完所有龙的最小花费是多少,若不能屠完所有的龙, 则要输出 Loowater is doomed!。
为了保证每一个骑士的价值得到最大的使用,那么就要尽量屠杀不超过kni[i]的最大的直径的龙头。不难想到,我们首先对dra和kni升序排列,挨个比对。如果第一个骑士能屠第一条龙,就赶紧让他屠掉,然后看第二条龙和第二个骑士。若不能,则看第二个骑士是否能屠第一条龙,依次判断。结局共有以下几种:
1.龙屠完了,骑士也用完了。 任务完成。
2.龙屠完了,骑士没用完。 任务完成。
3.龙没屠完,骑士用完了。 任务失败。
4.龙没屠完,骑士也没用完(可以理解为,没有骑士能屠掉头直径最小的龙)。 任务失败。
写个循环,然后判断循环变量的最终情况,输出相应结果。
当然上述情况中第三种是可以在处理数据前就直接判断的,即m < n。
代码总览
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define nmax 20005
using namespace std;
int dra[nmax],kni[nmax];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m) &&(n||m)){
for(int i = 0;i<n; ++i) scanf("%d",&dra[i]);
for(int i = 0;i<m; ++i) scanf("%d",&kni[i]);
if(m<n){
printf("Loowater is doomed!
");
continue;
}
sort(dra,dra+n);
sort(kni,kni+m);
int ans = 0,i,j;
for( i = 0,j =0; i<n&&j<m; ){
if(dra[i] <= kni[j]){
ans+=kni[j]; i++;j++;
}else{
j++;
}
}
if(i == n){
printf("%d
",ans);
continue;
}
if(j == m && i!= n){
printf("Loowater is doomed!
");
}
}
return 0;
}