贪心策略如下:
如果田忌最快的马比齐王最快的马快
则田忌最快的马必定胜一场,最优策略是消耗掉齐王最快的马。
如果田忌最快的马比齐王最快的马慢
则齐王最快的马必定胜一场,最优策略是用田忌最慢的马去消耗齐王最快的马
如果田忌最快的马与齐王最快的马速度相同,则分为以下两个情形
1.田忌最慢的马比齐王最慢的马快
则齐王最慢的马必定输一场,最优策略是用田忌最慢的马去消耗齐王最慢的马
2.田忌最慢的马小于等于齐王最慢的马
此时田忌最慢的马必定不会赢一场,齐王最快的马必定不会输一场,则最优策略是用田忌最慢的马去消耗齐王最快的马
代码思路:用数组表示队列,维护头尾指针即可
#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <memory>
#include <math.h>
#include <algorithm>
#include <stdlib.h>
using namespace std;
int n;
int tianh[1005];
int qih[1005];
int main()
{
while(cin >> n,n)
{
memset(tianh,0,sizeof(tianh));
memset(qih,0,sizeof(qih));
for(int i=0; i<n; i++)
cin >> tianh[i];
for(int i=0; i<n; i++)
cin >> qih[i];
int qhead = 0,qtail = n-1,thead=0,ttail=n-1;
int money = 0;
sort(tianh,tianh+n);
sort(qih,qih+n);
while(qhead<=qtail)
{
if(tianh[ttail] > qih[qtail])
{
money+=200;
qtail--;
ttail--;
}
else if(tianh[ttail] < qih[qtail])
{
money-=200;
qtail--;
thead++;
}
else
{
if(tianh[thead]>qih[qhead])
{
money+=200;
thead++;
qhead++;
}
else
{
if(tianh[thead]<qih[qtail])
money-=200;
thead++;
qtail--;
}
}
}
cout<<money<<endl;
}
return 0;
}