解题思考K. 奋勇争先续(sort函数使用说明书)
题目描述
Problem Description
还记得上次那个奋勇争先的题目吗,聪明的你帮助老师找出了第一名的同学。
现在,有个类似的问题:
已知每一位同学的解题数量和罚时,这次希望你能输出排名靠前的若干同学的名单。
注:
排名首先依据做题数量,若做题数量相同,则比较罚时,罚时少的排名靠前。
Input
第一行是数据组数CC,代表有CC组测试实例。
每一组数据第一行两个整数NN和MM,NN代表有NN个人的成绩,MM表示老师需要你输出前MM名的名单。
接下来NN行,每一行依次给出名字NameName,做出的题目数量numnum和罚时timetime
( 1<=C<=101<=C<=10, 2<M<=N<=10002<M<=N<=1000, Name的长度最大为1010,1<=num<=101<=num<=10, 10<=time<=10000010<=time<=100000 )
Output
每组测试数据输出$M$行,第$i$行为第$i$名的名字、解题数量和罚时,中间用空格隔开。
每组数据后空一行。
输入样例
1
3 3
Bob 5 50
Alice 4 46
John 5 48
输出样例
John 5 48
Bob 5 50
Alice 4 46
思考:sort函数排序:默认为升序,从小到大;
其它排序规则:写cmp函数自定义
排序范围:对数组A的0~n-1元素进行升序排序,只要写sort(A,A+n)即可;
#include<bits/stdc++.h>
using namespace std;
struct student{
char name[10];
int num;
int time;
}arr[1000];
bool cmp(student x,student y)
{
if(x.num==y.num){return x.time<y.time;};
return x.num>y.num;
}
int main()
{
int N;
cin>>N;
while(N--)
{
int n;
int m;
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>arr[i].name;
cin>>arr[i].num;
cin>>arr[i].time;
}
sort(arr,arr+n,cmp);
for(int i=0;i<m;i++)
{
cout<<arr[i].name<<" "<<arr[i].num<<" "<<arr[i].time<<endl;
}
}
}