P1093 [NOIP2007 普及组] 奖学金 题解

** 本人感觉这是一篇很水的橙题 。**

先讲思路:

此题考查的主要是结构体排序。

关于结构体:

结构体是用户定义的数据类型。它可以把几种不同类型的数据项集合成结构体这样一个单一类型。

于是有了这种神奇的东西后,我们便可以讲许多数据绑定在一起。

定义结构体:

struct node{
	int x,y,s,yy,z;
}r[114514];

关于结构体排序:

可以用一种数据排序,也可先优先用第一种,再用第二种。

由于结构体里可能包含多种数据,所以用 sort 较为方便(也许吧)。

所以……

sort(r+1,r+n+1);//r为结构体

由于 sort 默认是升序排列,所以要用 cmp。

bool cmp(node t1,node t2){
	return t1.z>t2.z;
}
//按z这个数据进行降序排序

主函数部分:

int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>r[i].y>>r[i].s>>r[i].yy;//y,s,yy分别是语文、数学、英语
		r[i].x=i;//给学生编号(记录学号)
		r[i].z+=(r[i].y+r[i].s+r[i].yy);//记录总分
	}
	stable_sort(r+1,r+n+1,cmp);//stable_sort()是sort的稳定排序
	for(int i=1;i<=5;i++){
		cout<<r[i].x<<" "<<r[i].z<<endl;
	}
	return 0;
}

应该能看懂吧。

我的代码要用稳定排序,否则会 WA 一个点(也不知道为什么)。 所以……

AC代码

#include<bits/stdc++.h>
using namespace std;
int n;
struct node{
	int x,y,s,yy,z;
}r[114514];
bool cmp(node t1,node t2){
	if(t1.z==t2.z){
		return t1.y>t2.y;
	}
	return t1.z>t2.z;
}//先判断总分,再判断语文成绩,学号已经排好了,所以不用管
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>r[i].y>>r[i].s>>r[i].yy;
		r[i].x=i;
		r[i].z+=(r[i].y+r[i].s+r[i].yy);
	}
	stable_sort(r+1,r+n+1,cmp);
	for(int i=1;i<=5;i++){
		cout<<r[i].x<<" "<<r[i].z<<endl;
	}
	return 0;//完结撒花^_^
}

温馨提示:抄袭不利己

posted @ 2023-10-27 18:56  IOI_official  阅读(61)  评论(0)    收藏  举报  来源