0
已解决
题目描述 Description
篮球课上,教体育的沈老师正带领同学们在举办投篮比赛。每位同学都有一个编号,同学们按照编号的顺序上场比赛,最后我们要评出得分最高的三位同学的编号,以及得分最低的三位同学的编号(注意:最终每位小朋友获得的投篮得分不同,且求解的小朋友编号按升序排列)。现在比赛已经结束了,你能帮助数学不好的沈老师,找出投篮得分最多的前三位小朋友和投篮得分最少的后三位小朋友的编号吗?
输入描述 Input Description
输入数据有2行,第1行一个数,表示同学的个数
第2行有n个分别用空格分开的数,表示投篮得分,第1个数对应编号为1的同学,第2个数对应编号为2的同学……其他同学编号依次类推,最后一个同学编号为n。
输出描述 Output Description
输出数据有2行,第1行为投篮得分排名前三的同学编号,第2行为排名后三名的同学编号。编号按升序排列。
样例输入 Sample Input
10
88 67 91 58 64 75 82 66 97 86
样例输出 Sample Output
1 3 9
4 5 8
数据范围及提示 Data Size & Hint
数据范围:
0<n<100000 0<得分<100000
0分代码:
#include<bits/stdc++.h>
using namespace std;
struct P{
int df;
int id;
}a[100005];
bool cmp(P x,P y){
return x.df<y.df;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].df;
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
cout<<a[n-2].id<<" "<<a[n-1].id<<" "<<a[n].id<<endl;
cout<<a[1].id<<" "<<a[2].id<<" "<<a[3].id;
return 0;
}
谭迪元在2021-09-29 19:18:47追加了内容
@张一宸 @小**咕咕叫15856960106 @李锦昊
0
已采纳
两个核心:
struct p{
int a,b;
}m[100005];
bool cmp1(p i,p j){
return i.a>j.a;
}
bool cmp2(p i,p j){
return i.b<j.b;
}
bool cmp3(p i,p j){
return i.b<j.b;
}
sort(m+1,m+n+1,cmp1);
sort(m+1,m+3+1,cmp2);
sort(m+n-2,m+n+1,cmp3);
for(int i=1;i<=3;i++){
cout<<m[i].b<<" ";
}
cout<<endl;
for(int i=n-2;i<=n;i++){
cout<<m[i].b<<" ";
}
0
核心:
int n; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i].a; a[i].id=i; } sort(a+1,a+n+1,cmp1); sort(a+1,a+3+1,cmp); for(int i=1;i<=3;i++){ cout<<a[i].id<<" "; } cout<<endl; sort(a+n-2,a+n+1,cmp); for(int i=n-2;i<=n;i++){ cout<<a[i].id<<" "; }
0

