@chen_zhe 我想提交P1093 [NOIP2007 普及组] 奖学金的题解,结合上一次的失败经验,我又进行了一次改动,具体内容如下:
/*这题非常的有意思,但是重点就在于怎么排序上,所以最简洁的方法就是合并一下,但是学号要相反处理,剩余的找出前五个大的就行了
这题我们可以将几个值按优先级合并
首先合并一下,优先级分别是总分、语文、学号,但因为学号是越小越优先,所以要相反处理。
int m=b1+b2+b3;
int k=(m*100000)+(b1*1000)+(100-i);
b[i]=m;
a[i]=k;
接着求出前五名
for(i=1;i<=5;i++)
{
maxn=0;
for(j=1;j<=n;j++)
{
if(a[j]>maxn)
{
maxn=a[j];
maxm=j;
}
}
cout<<maxm<<' '<<b[maxm]<<endl;
a[maxm]=-1;
}
最后合并程序
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,i,j,b1,b2,b3,a[301],b[301],maxn,maxm;
memset(a,-1,sizeof(a));
cin>>n;
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&b1,&b2,&b3);
int m=b1+b2+b3;
int k=(m*100000)+(b1*1000)+(100-i); //把几个值合并
b[i]=m;
a[i]=k;
}
for(i=1;i<=5;i++) //找出前五个大的
{
maxn=0;
for(j=1;j<=n;j++) //打擂台
{
if(a[j]>maxn)
{
maxn=a[j];
maxm=j;
}
}
cout<<maxm<<' '<<b[maxm]<<endl;
a[maxm]=-1; //标记,以免重复
}
return 0;
}
好了,这题就这么结束了,根本不需要那么多if和else(别想复杂了)*/