UVa11292

题目链接

分析:
能力强的骑士开高价是合理的
但是不能大材小用,所以我们直接贪心
把龙和骑士排序之后,
一个一个砍就行了
当然,不能砍掉“当前需要砍掉的头”的骑士我们就不用再考虑ta了

tip

成功的砍掉一个头之后,不要忘了把骑士的指针向后推移一位

附图:
这里写图片描述

//这里写代码片
#include <iostream>  
#include <cstdio>  
#include <cstring>  
#include <algorithm>  
using namespace std;  
const int M=20005;  
int a[M],b[M];  
int main()  
{  
    int n,m;  
    while(scanf("%d%d",&n,&m)&&n&&m)  
    {  
        int i,j=0,sum=0;  
        for(i=0;i<n;i++)  
            scanf("%d",&a[i]);  
        for(i=0;i<m;i++)  
            scanf("%d",&b[i]);  
        sort(a,a+n);  
        sort(b,b+m);  
        for(i=0;i<m;i++)  
            if(b[i]>=a[j])  
            {  
                sum+=b[i];  
                if(++j==n) break;  
            }  
        if(j<n) printf("Loowater is doomed!
");  
        else printf("%d
",sum);  
    }  
    return 0;  
}  

当然,还有一种更优美的写法:

//这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;

int n,m;
int dragon[20010],knight[20010];
int ans=0;

int main()
{
    while (scanf("%d%d",&n,&m)!=EOF&&n&&m)
    {
        for (int i=1;i<=n;i++) scanf("%d",&dragon[i]);
        for (int i=1;i<=m;i++) scanf("%d",&knight[i]);
        if (n>m) 
        {
            printf("Loowater is doomed!
");
            continue;
        }

        sort(dragon+1,dragon+1+n);
        sort(knight+1,knight+1+m);

        ans=0;
        int cnt=1;
        for (int i=1;i<=m;i++)
            if (knight[i]>=dragon[cnt])
            {
                ans+=knight[i];
                if (++cnt>n) break;
            }

        if (cnt<n) printf("Loowater is doomed!
");
        else printf("%d
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/wutongtong3117/p/7673026.html