问题描述:你的王国里有一条n个头的恶龙,可以雇佣骑士把它杀死,村里有m个骑士,能力值为x的骑士可以砍掉一个恶龙直径不超过x的头,且需支付金币x,怎样才能杀死恶龙并且支付金币最少?(一个骑士只能砍一个头,雇佣一次) 【格式输入】 每组数据的第一行为 n,m。下面n行每行为一个整数,代表恶龙头的直径,以下m行每行为一个整数,代表每个骑士的能力,输入结束标志是n=m=0。 【样例输入】 2 3 5 4 7 8 4 2 1 5 5 10 0 0 【样例输出】 11 Loowater is doomed!

问题解答:将骑士按能力从大到小排序,头的直径也按从大到小排序,一个一个的砍。

#include<stdio.h>
#include<algorithm>
using namespace std;

const int maxn = 20000;

int main(){
    FILE*fp;
    //一个数组用来装头的直径,一个数组用来装骑士的能力
    int A[maxn],B[maxn],n,m,i,cur ,cost ;

    if(NULL==(fp=fopen("a.txt","r")))
    {
        puts("error!");
        return -1;
    }
    while(fscanf(fp,"%d%d",&n,&m) == 2 &&n &&m){
        cost = 0;     //这边切记要置为0,因为每次循环都是一组新的数据
        cur = 0;
        for(i = 0;i < n;i++) fscanf(fp,"%d",&A[i]);
        for(i = 0;i < m ;i++) fscanf(fp,"%d",&B[i]);

        sort(A,A+n);
        sort(B,B+m);

        for(i = 0;i < m;i++){
            if(B[i]>=A[cur]){
                cost += B[i];
                if(++cur == n) break;  //如果所有的头都砍完了就退出循环
            }
        }
        //如果还有头没砍完,则证明无解。
        if(cur < n) printf("Loowater is doomed!\n");
        else printf("%d\n",cost);

    }
    return 0;
}