申请发题解
  • 板块工单反馈版
  • 楼主kuaihuoya
  • 当前回复8
  • 已保存回复8
  • 发布时间2022/4/15 15:44
  • 上次更新2023/10/28 03:42:27
查看原帖
申请发题解
608785
kuaihuoya楼主2022/4/15 15:44

@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(别想复杂了)*/

2022/4/15 15:44
加载中...