UVa11292

来源:互联网 发布:数码大师 mac版下载 编辑:程序博客网 时间:2024/05/24 04:39

Problem: Dragon of Loowater
Description: 一个王国中有N个骑士,有M条恶龙。每个骑士都有一个属性X,代表着这个骑士可以砍掉一头直径不大于X的头的恶龙,并且花费X金币。现在问你这些骑士能不能把所有恶龙的头都砍掉,如果能,那么最低要花费多少钱雇佣他们。
Solution: 看到这个题我们肯定会有一个直觉。那就是让骑士去砍他能砍的头最大的恶龙。恶龙肯定是要都砍完的,那么我们就对恶龙排序,从最小的开始砍。现在问题来了,派谁去砍最小的,当然是派花费最小的去砍。如果他砍不掉就换花费第二小的。这样,就能保证花费最小,并且可能的话,恶龙都会被砍掉。要排两次序。
Code(C++):

#include <stdio.h>#include <string.h>#include <stdlib.h>const int M=20000+5;int n,m;int dragon[M];int soilder[M];int cmp(const void *a,const void *b){    return *((int *)a)-*((int *)b);}int main(){    while(scanf("%d%d",&n,&m),!(!n&&!m)){        for(int i=0;i<n;i++)            scanf("%d",&dragon[i]);        for(int i=0;i<m;i++)            scanf("%d",&soilder[i]);        qsort(dragon,n,sizeof(dragon[0]),cmp);        qsort(soilder,m,sizeof(soilder[0]),cmp);        int ans=0;        int cnt=0;        for(int i=0;i<m;i++){            if(soilder[i]>=dragon[cnt])                ans+=soilder[i],++cnt;            if(cnt==n)                break;        }        if(cnt==n)            printf("%d\n",ans);        else            puts("Loowater is doomed!");    }    return 0;}
0 0