高三全省联合模拟考试刚刚结束,经过各科老师的努力,各个学科的改卷工作终于结束了,每位同学的各科分数也已经结算完毕。此时,老师们开始模拟各个高校录取情况。
每个大学有自己的录取范围。例如,清华、北大招生约为理科全省前100名,复旦、上海交大在全省理科101至300名。老师们想要知道哪些同学可以进入某个名校。
可是,统计软件突然失灵,查询和比对工作也无法进行,只有事先已经得到的理科每位同学的各科成绩。现在请你帮助老师编写一个程序,显示出可以进入某高校的名单。
此次考试理科排名规则:
1. 按照语文、数学、外语、理科综合四门科目总分由高到低排名;
2. 若总分相同,则按照数学成绩由高到低排名;
3. 若总分和数学成绩都相同,按照理科综合成绩由高到低排名;
4. 若总分、数学、理科综合都相同,按照语文成绩由高到低排名;
5. 若总分、数学、理科综合、语文成绩都相同,则按照报名序号从小到大排序(这里报名序号为输入顺序,第1个输入就是1号,第100个输入就是100号)。
第一行三个整数n,a和b,分别表示参加考试的人数和某高校的录取名次范围(从名次a到名次b)。
接下来n行,每行4个整数,表示每位同学的每门学科的成绩。依次为语文、数学、英语、综合。成绩0<=x<=300。
输出b-a+1行,排名在a~b名的同学信息。
每行两个整数,分别为报名序号和总分(报名序号看题目描述),中间用空格分开。
6 3 5
118 139 130 286
105 130 129 296
113 138 123 291
104 133 119 283
89 139 116 287
103 127 118 288
Copy
2 660
4 639
6 636
Copy
7 3 5
118 139 130 286
105 130 129 296
113 138 123 291
105 130 129 296
89 139 116 287
107 127 116 286
103 127 118 288
Copy
2 660
4 660
7 636
Copy
1s, 256MB.
【样例1解释】
排序后由高到低
序号 总分
1 118 139 130 286 673
3 113 138 123 291 665
2 105 130 129 296 660
4 104 133 119 283 639
6 103 127 118 288 636
5 89 139 116 287 631
输出3~5名的序号和总分
【样例2解释】
排序后由高到低
序号 总分
1 118 139 130 286 673
3 113 138 123 291 665
2 105 130 129 296 660
4 105 130 129 296 660
7 103 127 118 288 636
6 107 127 116 286 636
5 89 139 116 287 631
7号和6号同为636分,数学分数又相同,理科综合分数7号较高,因此排在6号前面。
2号和4号所有成绩都相同,只能按照序号排序,2号在4号之前
【数据范围】
对于40%的数据,1<=a<=b<=n<=100,且保证每个人的总分都不相同。
对于70%的数据,1<=a<=b<=n<=300。
对于100%的数据,1<=a<=b<=n<=100000。
参考代码:
#include
using namespace std;
struct chengji
{
int yw,sx,yy,lz,zf,xh;
}a[100005];
bool cmp(chengji s1,chengji s2)
{
if(s1.zf!=s2.zf)
{
return s1.zf > s2.zf;
}
if(s1.sx!=s2.sx)
{
return s1.sx>s2.sx;
}
if(s1.lz!=s2.lz)
{
return s1.lz > s2.lz;
}
if(s1.yw != s2.yw)
{
return s1.yw > s2.yw ;
}
return s1.xh> n>> x >> y;
for(i=1;i<=n;i++)
{
cin >> a[i].yw >> a[i].sx>> a[i].yy >> a[i].lz;
a[i].zf= a[i].yw+a[i]. sx+a[i].yy+a[i].lz;
a[i].xh =i;
}
sort(a+1 ,a+n+1, cmp);
for(i=x;i<=y;i++)
{
cout << a[i].xh << " "<< a[i].zf<< endl;
}
}
解析+代码:
#include
using namespace std;
struct student
{
float yw;//语文
float sx;//数学
float wy;//外语
float lz;//理综
float zf;//总分
int id;//输入的序号
};
student s[100005];//结构体数组s
bool cmp(student s1, student s2)//比较两个人的情况
{
if(s1.zf != s2.zf)//总分不等,则按照总分从大到小排序
return s1.zf > s2.zf;
else if(s1.sx!=s2.sx)//数学不等,则按照数学从大到小排序
return s1.sx > s2.sx;
else if(s1.lz!=s2.lz)//理综不等,则按照理综从大到小排序
return s1.lz > s2.lz;
else if(s1.yw!=s2.yw)//语文不等,则按照语文从大到小排序
return s1.yw > s2.yw;
else if(s1.id!=s2.id)
return s1.id < s2.id;
}
int main()
{
int n,a,b;
cin >> n>>a>>b;
for(int i = 1; i <= n; i++)
{
cin >> s[i].yw >> s[i].sx >> s[i].wy>>s[i].lz;
s[i].zf = s[i].yw + s[i].sx+s[i].wy+s[i].lz;//输入的时候可以计算总分
s[i].id = i;//把i当成序号记录一下
}
sort(s+1, s+n+1, cmp);//结构体需要自定义比较方式
for(int i = a; i <= b; i++)
{
cout<