nyoj364(田忌赛马)
大体题意:田忌与国王赛马,赢一局田忌加200,输一局田忌减200,问田忌最多能得多少钱,可以是负的
输入3 92 83 71 95 87 74 2 20 20 20 20 2 20 19 22 18
200 0 0
解题思路:
贪心贪赢,从大的开始比较,如果大的比较可以赢,就让大的比,
目的:为了己方小的与对方大的比较时赢得胜利的几率增大,如果大的赢不了,
先不认输,让小的比较,赢了就比,赢不了,就拉上对方大的(为什么还要比较?
因为前几次都没有比较是否相等,此次是为了让输得次数加一,有可能己方小的与对方大的相等),为了下一次大的比较时,让己方大的赢得几率大。
贪心贪两方面:
1.贪本局赢(多赚钱)
2.贪队友赢(为队友留下更大赢得几率)
#include <stdio.h>
#include <algorithm>
int tian[1000];
int king[1000];
int result, n;
int getres()
{
result = 0;
int nk = n-1, ks = 0, tk = 0;
n--;
while (true)
{
if (tian[n] > king[nk]) // 大的可以赢,为小的与大的比较时留下赢得希望
{
nk--;
n--;
result += 200;
}
else if (tian[tk] > king[ks]) // 小的可以赢,可以赢就赢白,别浪费了
{
ks++;
++tk;
result += 200;
}
else if (tian[tk] < king[nk]) // 小的输了,拉大的下马,为大的比较留下希望
{
nk--;
++tk;
result -= 200;
}
else // 平局
{
ks++;
++tk;
}
if (ks > nk)
break;
}
printf("%d\n", result);
}
int main()
{
while (~scanf("%d", &n))
{
for (int i=0; i<n; ++i)
scanf("%d", &tian[i]);
for (int i=0; i<n; ++i)
scanf("%d", &king[i]);
std::sort(tian, tian+n);
std::sort(king, king+n);
getres();
}
return 0;
}