hdu 1052 Tian Ji -- The Horse Racing 贪心算法

参考网址:点击打开链接

先将田忌跟齐王的马的速度数组进行一次冒泡排序

1、如果田忌最快的马比齐王最快的马快,则比之

2、如果田忌最快的马比齐王最快的马慢,则用田最慢的马跟齐最快的马比  //这是贪心的第一步

3、如果田忌最快的马的速度与齐威王最快的马速度相等

3.1、如果田忌最慢的比齐威王最慢的快,则比之                         //这是贪心的第二步

3.2、如果田忌最慢的比齐威王最慢的慢,田忌慢VS齐王快

3.3、田忌最慢的与齐威王最慢的相等,田忌慢VS齐王快

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int num1[1012],num2[1022];
int vis1[1010],vis2[1021];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)
            break;
        for(int i=0; i<n; i++)
            scanf("%d",&num1[i]);
        for(int i=0; i<n; i++)
            scanf("%d",&num2[i]);
        memset(vis1,0,sizeof(vis1));
        memset(vis2,0,sizeof(vis2));
        sort(num1,num1+n);
        sort(num2,num2+n);
        int sum=0,cnt=0;
        while(cnt!=n)
        {
            int max1,max2,min1,min2;
            int t1,t2,t3,t4;
            for(int i=n-1; i>=0; i--)
            {
                if(!vis1[i])
                {
                    max1=num1[i];
                    vis1[i]=1;
                    t1=i;
                    break;
                }
            }
            for(int i=n-1; i>=0; i--)
            {
                if(!vis2[i])
                {
                    max2=num2[i];
                    vis2[i]=1;
                    t2=i;
                    break;
                }
            }
            if(cnt+1==n)
            {
                if(max1>max2)
                {
                    sum++;
                }
                else if(max1<max2)
                {
                    sum--;
                }
                else if(max1==max2)
                {

                }
                break;
            }
            for(int i=0;i<n;i++)
            {
                if(!vis1[i])
                {
                    min1=num1[i];
                    vis1[i]=1;
                    t3=i;
                    break;
                }
            }
            for(int i=0;i<n;i++)
            {
                if(!vis2[i])
                {
                    min2=num2[i];
                    vis2[i]=1;
                    t4=i;
                    break;
                }
            }
            if(max1>max2)
            {
                vis1[t3]=0;
                vis2[t4]=0;
                sum++;
            }
            else if(max1==max2)
            {
                if(min1>min2)
                {
                    sum++;
                    vis1[t1]=0;
                    vis2[t2]=0;
                }
                else if(min1==min2)
                {
                    if(min1<max2)
                    {
                        vis1[t1]=0;
                        vis2[t4]=0;
                        sum--;
                    }
                    else
                    {
                        vis1[t1]=0;
                        vis2[t4]=0;
                    }
                }
                else if(min1<min2)
                {
                    vis1[t1]=0;
                    vis2[t4]=0;
                    sum--;
                }
            }
            else
            {
                vis1[t1]=0;
                vis2[t4]=0;
                sum--;
            }
            cnt++;
        }
        printf("%d\n",sum*200);
    }
    return 0;
}


你可能感兴趣的:(hdu 1052 Tian Ji -- The Horse Racing 贪心算法)