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;//完结撒花^_^
}
温馨提示:抄袭不利己

浙公网安备 33010602011771号