例: Tian Ji -- The Horse Racing - POJ 2287 - Virtual Judge (vjudge.net)
题目就是田忌赛马,不过不是3匹而是n匹马,也不是一一对应的比齐王的慢一点,而是输入的。
首先田忌赛马的思想应当用最慢的马拼掉对方最快的马,所以从最慢的马下手,先和对方最慢的马比较,如果快说明己方所有的马都能胜过对方这匹马,此时用最慢的赢当然收益最大,如果慢,此时发挥己方的马的最大价值来拼掉对方最快的马,如果相等,再用己方最快的马和对方最快的马比较,如果快,则己方的快马可以赢下对方所有的马,当前要赢下最强的来最大化收益,如果相等,此时己方的慢马也是打平快马也是打平不妨就用慢马拼掉快马来个一胜一负,如果慢,说明对方的快马可以赢过己方所有的马,当然用最慢的马拼掉来取得最大收益。
总结:
先比较两边的慢马
1、己方最慢的马 > 对方最慢的马 赢下即可
2、己方最慢的马 < 对方最慢的马 拼掉对方最快的马 (此时必输)
3、己方最慢的马 = 对方最慢的马
此时比较快马
3.1、己方最慢的马 > 对方最慢的马 赢下即可
3.2、己方最慢的马 <= 对方最慢的马 用慢马拼掉对方的快马 (此时可能平)
实现
sort(a + 1,a + 1 + n);
sort(b + 1,b + 1 + n); //b为己方的马
int win = 0, pi = 0; //总局数为n,计算赢得和平局的剩下就是输的
int al = 1, ar = n;
int bl = 1, br = n;
while(bl <= br)
{
if(b[bl]>a[al])bl++,al++,win++; //1
else if (b[bl]<a[al])bl++,ar--; //2
else
{
while(b[br]>a[ar])br--,ar--,win++; //3.1
if(a[ar]==b[bl])pi++; //3.2 用慢马拼掉对方的快马 ,如果也平局
ar--,bl++; //3.2 输
}
}
cout << (win - (n - pi - win)) * 200 << endl;