一道贪心题-HDU-1052

来源:互联网 发布:淘宝怎么会有苏宁易购 编辑:程序博客网 时间:2024/05/07 06:55

本题故事是由田忌赛马引起的,但是什么田忌赛马的我是不管咯啊。废话不多说,先把题目大概意思讲一下:路人甲和路人乙各有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;}


0 0
原创粉丝点击