题目描述
在卡卡西的带动下,其他小伙伴也都逐渐被吸引过来,大家卷起袖子,挥起铲子,都想种几棵属于自己的小树,帮助园艺叔叔把任务完成。看着大家干劲十足,卡卡西灵机一动,大声说道:“亲爱的小伙伴们,让我们来一场植树比赛吧。每人都有一个编号,植树都可以获得植树积分,最后评出植树积分最多的前三位小朋友和植树积分最少的后三位小朋友的编号(注意:最终每位小朋友获得的总植树积分不同,且求解的小朋友编号按升序排列),看看谁效率最高”“好!……”小朋友们一致赞同卡卡西的想法,大家鼓足了劲,奋力挥铲,都不想成为积分排名最后的小朋友。没一会功夫,小朋友们就把当天的树苗全部栽种完毕,每位小朋友都获得了相应的植树积分。下面,你们能帮助卡卡西,找出植树积分最多的前三位小朋友和植树积分最少的后三位小朋友的编号吗?
输入格式
输入数据有2行,第1行一个数,表示小朋友个数,第2行有n个分别用空格分开的数,表示植树积分,第1个数对应编号为1的小朋友,第2个数对应编号为2的小朋友……其他小朋友编号依次类推,最后一个小朋友编号为n,测试数据能保证每位小朋友最终获得的总植树积分不同。
输出格式
输出数据有2行,第1行为总植树积分排名前三的小朋友编号,第2行为排名后三名的小朋友编号。编号按升序排列。
输入输出样列
输入样例1:
10 88 67 91 58 64 75 82 66 97 86
输出样例1:
1 3 9 4 5 8
说明
数据范围:
0<n<100000 0<积分<100000
此题运用了排序,但在前三位与后三位较难比较,所以我们应当使用结构体与sort排序完成此题;
附上代码:
#include<bits/stdc++.h>
using namespace std;
struct tree
{
int num,point;
}
a[100001];
int cmp(tree a,tree b)
{
if(a.point!=b.point) return a.point>b.point;
return a.num<b.num;
}
int cmp2(int a,int b)
{
return a<b;
}
int b[10],c[10];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;++i)
{
cin>>a[i].point;
a[i].num=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=3;++i)
{
b[i]=a[i].num;
}
sort(b+1,b+3+1,cmp2);
for(int i=1;i<=3;++i)
{
c[i]=a[n-i+1].num;
}
sort(c+1,c+3+1,cmp2);
for(int i=1;i<=3;++i)
{
cout<<b[i]<<" ";
}
cout<<endl;
for(int i=1;i<=3;++i)
{
cout<<c[i]<<" ";
}
return 0;
}
以上为AC代码,望采纳;