一道贪心题-HDU-1052

本题故事是由田忌赛马引起的,但是什么田忌赛马的我是不管咯啊。废话不多说,先把题目大概意思讲一下:路人甲和路人乙各有n匹马,现在给出了这些马的速度,如何匹配这些马儿使得路人甲获得最大利益?(ps:赢一场得200积分,输一场减去200积分,平局不增不减)。

分析:这题目是我在题目分类中看到的一道贪心题。我们可以把它做如下分类;

           1、路人甲的最快马速度 > 路人乙的最快马速度, 则该两匹马匹配;

           2、路人甲的最快马速度 < 路人乙的最快马速度,则用路人甲的最慢马与路人乙的最快马匹配;

           3、路人甲的最快马速度 = 路人乙的最快马速度:(a)路人甲的最慢马速度 > 路人乙最慢马速度,该两匹最慢马匹配;

                                                                                                  (b)路人甲的最慢马速度 <= 路人乙的最慢马速度,路人甲的最慢马与路人乙的最快马匹配。

           这是解决该题目的分类情况。详细分析请参考:http://blog.csdn.net/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;
}


你可能感兴趣的:(HDU,贪心)