hdu 1052 Tian Ji -- The Horse Racing(很好的贪心)


题目分析:

这题的题意就是求怎么让田忌赢最多,可以赢负的。

算法是先将两个都排序,然后按1、田忌的快马比齐王的快,直接比掉。2、若快马没有快,拿田忌最慢的和齐王最慢的比较,若快直接比掉。3、若慢马比齐王慢,就拿田忌最慢的和齐王最快的比较。

按这个算法就可以啦!不过有一组很好的测试数据。

4

1 2 4 5

2 3 3 4

注意:1.很好的贪心题

          2. 哎,贪心都不会了,可悲呀,原来的思路彻底错了。。。。。

          3.注意不要拘泥于一段,,,

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int cmp(int x,int y)
{
	return x>y;
}
int main()
{
    int a[1200],b[1200];
	int n;
	while(scanf("%d",&n)!=EOF&&n!=0)
	{
        for(int i=1;i<=n;i++)
			scanf("%d",&a[i]);
		for(int i=1;i<=n;i++)
			scanf("%d",&b[i]);
		sort(a+1,a+1+n,cmp);
		sort(b+1,b+1+n,cmp);
		/*for(int i=1;i<=n;i++)
			printf("%d  ",a[i]);
		printf("\n");
		for(int i=1;i<=n;i++)
			printf("%d   ",b[i]);
        printf("\n");*/
	
		int h1,h2,t1,t2;
		int w=0,l=0;
		h1=1,h2=1,t1=n,t2=n;
		for(int i=1;i<=n;i++)
		{
			if(a[h1]>b[h2])
			{
				w++;
				h1++;
				h2++;
			}
			/*else if(a[h1]==b[h2])
			{
                
			}*/
			else
			{
				if(a[t1]>b[t2])//最慢的和最慢的比较
				{
					w++;
					t1--;
					t2--;
				}
				else//最慢的和最快的比较a[t1]与b[h2]比较
				{
					if(a[t1]==b[h2])
						;
					else
					   l++;
					t1--;
					h2++;
				}
			}
		}
		printf("%d\n",(w-l)*200);
	}//
    system("pause");
	return 0;
}

/*我这种的思想是,先升序排列,用田最慢的马和齐王最慢的比较,如快 直接比掉;若慢,就和齐王最快的比掉
如相等,看下一对,,,
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int cmp(int x,int y)
{
	return x<y;
}
int main()
{
	int a[1200],b[1200];
	int  vis[1200];
	int n;
	while(scanf("%d",&n)!=EOF&&n!=0)
	{
        for(int i=1;i<=n;i++)
			scanf("%d",&a[i]);
		for(int i=1;i<=n;i++)
			scanf("%d",&b[i]);
		sort(a+1,a+1+n,cmp);
		sort(b+1,b+1+n,cmp);
		/*for(int i=1;i<=n;i++)
			printf("%d  ",a[i]);
		printf("\n");
		for(int i=1;i<=n;i++)
			printf("%d   ",b[i]);
        printf("\n");
		memset(vis,0,sizeof(vis));
		int win=0,l=0,tail=n;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(vis[j]==0)
				{
					if(a[i]>b[j])
					{
						win++;
						vis[j]=1;
					}
					else
					{
						/*
						if(a[i]<b[tail] && vis[tail]==0)//小于等于就让田输掉。。。是错的
						{                               //5;1 2  2 4 5 ;2 2 3 3 4
		                    l++;
						}
						vis[tail]=1; 
						tail--;
						//break;放错位置了

                        if(a[i]==b[j] && i+1<=n && j+1<=tail && a[i+1]!=b[j+1])//这一局平了
						{
							vis[j]=1;
							break;
						}
						if(a[i]<b[j]&&vis[tail]==0)//输掉
						{
							l++;
							vis[tail]=1;
							tail--;
						}
					}
					break;
			    }
	//printf("w=%d   l=%d\n",win,l);
	int ans=(win-l)*200;
	printf("%d\n",ans);
	}
	system("pause");
	return 0;
}
*/
/*
3
15 12 9
16 13 9
********
5
7 8 9 12 15
7 8 9  13 16
***************
4
1 2 4 5
2 3 3 4
200这组数据很好....


*/

/*
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int a[1005],b[1005];
    int i,n,sum,aa,ab,ba,bb;
    while(cin>>n&&n)
    {
        for(i=0;i<n;i++)
            cin>>a[i];
        for(i=0;i<n;i++)
            cin>>b[i];
        sort(a,a+n);
        sort(b,b+n);
        aa=0;ab=n-1;ba=0;bb=n-1;
        sum=0;
        for(i=0;i<n;i++)
        {
            if(a[ab]>b[bb]) {ab--;bb--;sum++;continue;}
            if(a[aa]<b[ba]) {aa++;bb--;sum--;continue;}
            if(a[aa]>b[ba]) {aa++;ba++;sum++;continue;}
            if(a[aa]==b[ba])
            {
                if(a[aa]<b[bb])
                    sum--;
                else
                {
                    if(a[aa]>b[bb])
                        sum++;
                }
                aa++;bb--;
            }
        }
        sum=sum*200;
        cout<<sum<<endl;
    }
    return 0;
}
*/


你可能感兴趣的:(算法,测试,System,ini)