此题是一道贪心算法的题目,稍微复杂了一点,将田忌和齐王的马,按速度从大到小分别排序,接下来的贪心算法主要有两部分:
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;
}
小结:贪心的题目个人觉得还是比较考验思维的,所以应该要多刷一些题,此外,从这道题中也可看出码代码能力的重要性,应在训练中不断提高这项技能,可以参照别人的代码。
分享: