http://acm.hdu.edu.cn/showproblem.php?pid=1052
贪心解题思路来源于
http://blog.csdn.net/yangshuolll/article/details/8042233 和同学讨论的一样。然后照着这个思路自己再打了一遍。
先将田忌跟齐王的马的速度数组进行一次排序
1、如果田忌最快的马比齐王最快的马快,则比之
2、如果田忌最快的马比齐王最快的马慢,则用田最慢的马跟齐最快的马比 //这是贪心的第一步
3、如果田忌最快的马的速度与齐威王最快的马速度相等
3.1、如果田忌最慢的比齐威王最慢的快,则比之 //这是贪心的第二步
3.2、如果田忌最慢的比齐威王最慢的慢,田忌慢VS齐王快
3.3、田忌最慢的与齐威王最慢的相等,田忌慢VS齐王快
AC代码:#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[1010],b[1010];
bool cmp(int a, int b)
{
return a>b;
}
int main()
{
int i,n,j,sum,k,f,ji;
while(scanf("%d",&n)&&n)
{
for(i = 0; i < n; i++)
{
scanf("%d",&a[i]);
}
for(i = 0; i < n; i++)
{
scanf("%d",&b[i]);
}
sort(a,a+n,cmp);
sort(b,b+n,cmp);
ji = 0; //记录齐王用过的马
i = j = sum = 0;
k = f = n-1; //排序后最慢的马的位置
while(ji!=n) //只要齐王的马没有比完则继续比
{
if(b[j] > a[i]) //齐王快马比田忌快马快
{
sum -= 200; //必定输一局
j++; //齐王最快的马背比掉
k--; //田忌最慢的马背比掉
ji++; //齐王的马被消耗一匹
continue;
}
if(b[j] == a[i]) //如果速度相等
{
if(b[f] < a[k]) //田忌最慢的马快于齐王的
{
f--; //齐王最慢的马比掉
k--; //田忌最慢的马比掉
sum += 200;
ji++;
continue;
}
if(b[j] > a[k])
{
sum -= 200;
k--;
j++;
ji++;
}
else
{
k--;
j++;
ji++;
}
continue;
}
if(b[j] < a[i])
{
sum += 200;
j++;
i++;
ji++;
continue;
}
}
printf("%d\n",sum);
}
return 0;
}