本题故事是由田忌赛马引起的,但是什么田忌赛马的我是不管咯啊。废话不多说,先把题目大概意思讲一下:路人甲和路人乙各有n匹马,现在给出了这些马的速度,如何匹配这些马儿使得路人甲获得最大利益?(ps:赢一场得200积分,输一场减去200积分,平局不增不减)。
分析:这题目是我在题目分类中看到的一道贪心题。我们可以把它做如下分类;
1、路人甲的最快马速度 > 路人乙的最快马速度, 则该两匹马匹配;
2、路人甲的最快马速度 < 路人乙的最快马速度,则用路人甲的最慢马与路人乙的最快马匹配;
3、路人甲的最快马速度 = 路人乙的最快马速度:(a)路人甲的最慢马速度 > 路人乙最慢马速度,该两匹最慢马匹配;
(b)路人甲的最慢马速度 <= 路人乙的最慢马速度,路人甲的最慢马与路人乙的最快马匹配。
这是解决该题目的分类情况。详细分析请参考:http://blog.youkuaiyun.com/qzh3578/article/details/12707889
#include<stdio.h>
#include<algorithm>
using namespace std;
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n!=0)
{
int a[1005],b[1005];
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
scanf("%d",&b[i]);
sort(a,a+n,cmp);
sort(b,b+n,cmp);
int head1=0,tail1=n-1;
int head2=0,tail2=n-1;
int sum=0;
while(head1<=tail1)
{
if(a[head1]>b[head2])
{
sum+=200;
head1++;
head2++;
}
else if(a[head1]<b[head2])
{
sum-=200;
tail1--;
head2++;
}
else
{
if(a[tail1]>b[tail2])
{
sum+=200;
tail1--;
tail2--;
}
else
{
if(a[tail1]<b[head2]) sum-=200;
tail1--;
head2++;
}
}
}printf("%d\n",sum);
}return 0;
}