概述:田忌赛马问题,Tian(田忌)赢一局得200分,King赢一局得200分,求最后Tian的得分。
思路:从Tian的角度出发,用自己的弱马,去抵消King的强马,一步步贪心,实现利益最大化。首先将Tian和King的马按照战力从大到小排列,从Tian战力最小的马开始挑战,如果King的马中有有其能战胜的马,就用它去战胜该马,并+200分,如果没有它能战胜的马,就用它去抵消掉King战力最强的马,并-200分。
感想:看起来比较容易,但是有很多小的细节需要处理,比如万一搜索到与之战力相等的马,该如何去处理。
#include<iostream>
#include<algorithm>
#include<fstream>
#include<vector>
using namespace std;
bool cmp(const int &a, const int &b)
{
return a > b;
}
int main()
{
//ifstream cin("aaa.txt");
int n,temp;
while (cin >> n&&n)
{
int win = 0, lose = 0;
vector<int> king, tian;
for (int i = 0; i < n;++i)
{
cin >> temp; tian.push_back(temp);
}
for (int i = 0; i < n; ++i)
{
cin >> temp; king.push_back(temp);
}
sort(king.begin(), king.end(),cmp);
sort(tian.begin(), tian.end(),cmp);
int tmax=0, tmin = n - 1, kmax=0, kmin = n - 1;
while (tmax <= tmin)
{
if (tian[tmin]>king[kmin])
{
win++;
tmin--;
kmin--;
}
else if (tian[tmin]<king[kmin])
{
lose++;
tmin--;
kmax++;
}
else
{
if (tian[tmax]>king[kmax])
{
win++;
tmax++;
kmax++;
}
else
{
if (tian[tmin]<king[kmax])
lose++;
tmin--;
kmax++;
}
}
}
cout << 200 * (win - lose) << endl;
}
return 0;
}