UVA.11292 Dragon of Loowater (贪心)

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!\n");
            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\n",ans);
            continue;
        }
        if(j == m && i!= n){
            printf("Loowater is doomed!\n");
        }
     }
    return 0;
}
posted @ 2017-02-27 21:54  pengwill  阅读(115)  评论(0编辑  收藏  举报