题目描述
输入n(n<=20000)个人的成绩和学号,请将这些人按成绩从高到低进行排序
输入
输入共n行,每行两个整数,分别表示成绩和学号
输出
输出共n行,每行两个数,按成绩从高到低进行输出
样例输入
5
100 5
4 8
24 90
98 2
99 3
样例输出
100 5
99 3
98 2
24 90
4 8
struct node {
int a1,b1;
} a[1000101];
1.很明显的双关键字排序,用到了struct!
其实struct明显是两数组或多数组,但两个数组或多个数组十分麻烦。将第一个排序,再把对应的b数组用一个c数组来判断是否是之前的数字。(本博客只会怎么点,大佬勿喷)
struct是这么用的:
(int a,b 可以定更多3,4,5,6,7,8…………a数组中100500是这道题的范围)这样就相当于一个a1数组,一个b1数组,还有个好处就是a1数组排序,b1也跟着排序。(相反道理一样)
那输出咋办呢?
看见a数组了吗?
只要这样:
cout<<a[i].a1;
同样:
cin>>a[i].a1;
你又问:
排序咋办?
(sort不会不知道吧)
这样:
sort(a+1,a+1+n,cmp);
不需要加a1,b1什么的。
你又双叒叕的问:
cmp咋么编?????
那你就得根据题目中说的了。
那就看我们的题目(两处线索):
1.请将这些人按成绩从高到低进行排序
2.输出共n行,每行两个数,按成绩从高到低进行输出
那就这么编(把成绩看为a1):
bool cmp(node q,node h) {
return q.a1>h.a1;
}
也可以:
bool cmp(node q,node h) {
if(q.b1>h.b1)return q.b1;
else return h.b1;
}
最后加上几句for就OK了!
cin行:
for(int i=1; i<=n; i++)cin>>a[i].a1>>a[i].b1;
然后是cout行:
for(int i=1; i<=n; i++)cout<<a[i].a1<<" "<<a[i].b1<<"\n";
代码:
#include <bits/stdc++.h>
using namespace std;
int n;
struct node {
int a1,b1;
} a[1000101];
bool cmp(node q,node h) {
return q.cj>h.cj;
}
main() {
cin>>n;
for(int i=1; i<=n; i++)cin>>a[i].a1>>a[i].b1;
sort(a+1,a+1+n,cmp);
for(int i=1; i<=n; i++)cout<<a[i].a1<<" "<<a[i].b1<<"\n";
}