UVa 11292 打卡

算法入门经典训练指南打卡

题目链接:UVa 11292

思路:

求需要花费的金币最少,即骑士的能力值之和最小,而每个骑士又必须且只能杀掉一个头。
所以我们只需要将骑士的能力值和恶龙的头的直径按照从小到大排序
如果该骑士可以砍掉当前的头,则记下,如果不可以则继续查找下一个骑士
最后返回结果即可

代码如下:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std ;

int main() {
    int n , m ;
    while (cin >> n >> m && !(m == 0 && n == 0)){
        int res = 0 ;		// res 代表所需金币
        vector<int> dragon ;	//存储恶龙的头的直径
        vector<int> brave ;		//存储每个骑士的能力值
        int x ;
        for(int i = 0 ; i < n ; ++ i){
            cin >> x ;
            dragon.push_back(x) ;	//输入恶龙的头的直径
        }
        for(int i = 0 ; i < m ; ++ i){
            cin >> x ;
            brave.push_back(x) ;	//输入骑士的能力值
        }
        sort(dragon.begin() , dragon.end()) ;	//按照从小到大排序
        sort(brave.begin() , brave.end()) ;
        int d = 0 , b = 0 ;
        while (d < dragon.size() && b < brave.size()){
            if(brave[b] >= dragon[d]){		//b指向的骑士可以砍下d指向的头
                res += brave[b] ;		//雇佣该骑士
                d ++ ;		//查看下一位骑士
                b ++ ;		//查看下一个头
            }
            else		//当前骑士无法砍下d指向的头
                b ++ ;		//查看下一位骑士
        }
        if(d < dragon.size())	//恶龙的头砍完了
            cout << "Loowater is doomed!" << endl ;
        else
            cout << res << endl ;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/just_gong/article/details/107820970