骑士斗恶龙
你的王国里有一条n个头的恶龙,你希望雇佣一些骑士把它杀死(砍掉所有的头)。村里有m个骑士可以雇佣,一个战斗为x的骑士可以砍掉恶龙一个直径不超过x的头,且需要支付x个金币。如何雇佣骑士才能砍掉恶龙的所有头,且需要支付的金币最少?注意,一个骑士只能砍一个头(且不能被雇佣两次)。
//骑士斗恶龙
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//恶龙
typedef struct node{
string name;
int DAttack;
}Dragon;
typedef struct{
string name;
int CAttack;
int Reward;
string Kill;
}Cavalier;
int main(int argc, char** argv) {
ifstream fin("Attack.txt");
Dragon Dtemp;
Cavalier Ctemp;
int n, m, i, j, sum = 0;
fin >> m >> n;
Dragon * D = new Dragon[n];
Cavalier * C = new Cavalier[m];
for (i = 0; i < n; i++){
fin >> D[i].name >> D[i].DAttack;
}
for (i = 0; i < m; i++){
fin >> C[i].name >> C[i].CAttack;
C[i].Reward = C[i].CAttack;
}
fin.close();
for (i = 0; i < m; i++){
C[i].Kill = "#";
}
for (i = 0; i < n - 1; i++){
for (j = 0; j < n - i - 1; j++){
if (D[j].DAttack > D[j + 1].DAttack){
Dtemp = D[j];
D[j] = D[j + 1];
D[j + 1] = Dtemp;
}
}
}
for (i = 0; i < m - 1; i++){
for (j = 0; j < m - i - 1; j++){
if (C[j].CAttack > C[j + 1].CAttack){
Ctemp = C[j];
C[j] = C[j + 1];
C[j + 1] = Ctemp;
}
}
}
for (i = 0, j = 0; i < m && j < n; i++){
if (D[j].DAttack <= C[i].CAttack){
C[i].Kill = D[j].name;
j++;
}
}
if (j == n){
cout << "\n作战情况如下:\n";
for (i = 0; i < m; i++){
if(C[i].Kill != "#"){
cout << endl << '\t' << "骑士" << C[i].name << "->" << "恶龙" << C[i].Kill << endl;
sum += C[i].Reward;
}
}
cout << "\n需要的总金币数为:" << sum << endl;
}
else{
cout << "骑士不能干掉这批龙!\n";
}
return 0;
}
以上的数据通过C++的读文件方式获得,文件内容如下:
5 3 Allen 300 Bob 310 Hellen 330
CA 350 CB 290 CC 320 CD 340 CE 330