题目意思:给定两组序列A和B,长度分别为n和m。对于A中的每个数据都要在B中找出大于或等于这个值的不同的值,并是这些至之和最小。
解法:贪心+搜索.
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
using namespace std;
vector<int> heads, knights;
vector<int>::iterator pHeads, pKnights;
int sum;
bool isSolve(){
bool ok;
for (pHeads = heads.begin(); pHeads != heads.end(); pHeads++){
ok = false;
for (pKnights = knights.begin(); pKnights != knights.end(); pKnights++){
if (*pKnights >= *pHeads){
sum += *pKnights;
knights.erase(pKnights);
ok = true;
break;
}
}
if (ok==false){
return false;
}
}
return true;
}
int main()
{
int tmpHead, tmpKnight;
int n,m;//n heads and m knights
while (~scanf("%d %d", &n, &m) && (n || m)){
heads.clear();
knights.clear();
sum = 0;
while (n--){ //save heads info
scanf("%d", &tmpHead);
heads.push_back(tmpHead);
}
while (m--){ //save knight info
scanf("%d", &tmpKnight);
knights.push_back(tmpKnight);
}
if (heads.size() > knights.size()){ //if n> m return false
cout << "Loowater is doomed!" << endl;
continue;
}
sort(heads.begin(), heads.end());
sort(knights.begin(), knights.end());
if (isSolve()){
cout << sum << endl;
}
else{
cout << "Loowater is doomed!" << endl;
}
}
return 0;
}