算法入门经典训练指南打卡
题目链接: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;
}