杭电1052--田忌赛马(贪心)

此题是一道贪心算法的题目,稍微复杂了一点,将田忌和齐王的马,按速度从大到小分别排序,接下来的贪心算法主要有两部分:
1.如果田最快的马比齐王最快的马快,直接比试,+200;
2.如果…比…慢,拿田最慢的马与齐最快的马比试,-200;(这两部分为贪心的第一部,我一开始就只想到了这一步而已,接下来会稍微复杂一些)
3.如果…与…一样快,那么进行以下比较:
A.如果田最慢的马比齐王最慢的马快,最慢VS最慢,+200;
B.如果…比…慢,最慢VS最快,-200;
C.如果…与…一样快,进行再一次的比较:
a.如果田最慢的马比齐王最快的马慢,最慢VS最快,-200;
b.如果…与…一样快,此时不用再进行比较了,因为接下来所有比试必然会打成平手

分出来的情况挺多的吧,所以接下来就很考验码代码的能力了,思路对了,码好了就AC,码不好,就WA。
代码如下:(参照网上大佬的代码写的)


#include<cstdio>
#include<algorithm>
using namespace std;
void quick_sort(int *a,int x,int y)
{
	if(y-x>1)
	{
		int i,j;
		int X=a[x];
		for(i=x,j=y-1;i<j;)
		{
			while(i<j&&a[j]<X) 
			    j--;
			if(i<j) 
			    a[i++]=a[j];
			while(i<j&&a[i]>=X)
			    i++;
			if(i<j) 
			    a[j--]=a[i];
			  //  printf("%d %d\n",a[i],a[j]);
		}a[i]=X;
		quick_sort(a,x,i);
		quick_sort(a,i+1,y);
	}
}
int main()
{
	int n;
	int i,j,p,q;
	int sum;
	int t[1005],k[1005];
	while(~scanf("%d",&n)&&n)
	{
		sum=0;
		q=n;
		for(i=0;i<=n-1;i++)
		    scanf("%d",&t[i]);
		for(i=0;i<=n-1;i++)
		    scanf("%d",&k[i]);
		quick_sort(t,0,n);
		quick_sort(k,0,n);
		i=j=0;
		while(i<n&&j<q)
		{
			if(t[i]>k[j])
			{
				sum+=200;
				i++;j++;
			}
			else if(t[i]<k[j])
			{
				sum-=200;
				n--;j++;
			}
			else
			{
				if(t[n-1]>k[q-1])
				{
					sum+=200;
					n--;q--;
				}
				else if(t[n-1]<k[q-1])
				{
					sum-=200;
					n--;j++;
				}
				else
				{
					if(t[n-1]<k[j])
					{
						sum-=200;
						n--;j++;
					}
					else
					{
						break;
					}
				}
			}
		}
//////////////////////////////////////////////////////////////////////////
		这是之前写的代码,WA。。。
//		for(i=0;i<=n-1;i++)
//		    printf("%d %d\n",t[i],k[i]);
//	    for(i=0;i<=n-1;i++)
//	    {
//	    	for(j=p;j<=q-1;j++)
//	    	{
//	    		if(t[i]>k[j]){
//	    			win++;p++;break;
//				}
//				else if(t[i]<k[j]){
//					lose++;p++;n--;i--;break;
//				}
//				else{
//					if(t[n-1]>k[q-1]){
//						even++;p++;break;
//					}
//					else if(t[n-1]<k[q-1]){
//						lose++;n--;p++;i--;break;
//					}
//					else{
//						if(t[n-1]<k[j]){
//							lose++;n--;i--;p++;break; 
//						}
//						else if(t[n-1]==k[i]){
//							even++;n--;i--;p++;break;
//						}
//					}
//				}
//			}
		//	printf("%d %d %d win,lose,even___\n ",win,lose,even);
		//	printf("%d %d %d %d i,n,p,q___ \n",i,n,p,q);
//		}
		printf("%d\n",sum);
	}
	return 0;
}

小结:贪心的题目个人觉得还是比较考验思维的,所以应该要多刷一些题,此外,从这道题中也可看出码代码能力的重要性,应在训练中不断提高这项技能,可以参照别人的代码。
分享:

猜你喜欢

转载自blog.csdn.net/shamansi99/article/details/86819053
今日推荐