输入样例:
2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85
输出样例
9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4
C++运行正确代码
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
struct student{
char num[15];
int id;
int grade;
int ranks;
int idrank;
bool operator > (student a) {
if(a.grade == grade){
return strcmp(num, a.num)<0;
}
return grade > a.grade;
}
}stu[30010];
void Qsort( int low, int high){
if( !(low<high) ) return;
int l = low, r = high;
stu[0] = stu[l];
while(l<r){
while(l < r && stu[0]>stu[r]) r--;
stu[l] = stu[r];
while(l<r && stu[l]>stu[0]) l++;
stu[r] = stu[l];//cout << l << " " << r << endl;
}
stu[l] = stu[0];
Qsort(low , l-1);//递归
Qsort(l+1, high);//递归
}
int t, n, sum = 0;
int main(){
cin>>t;
for(int j = 1; j <= t; j++){
cin>>n;
for(int i = 1; i <= n; i++){
cin>>stu[i+sum].num>>stu[i+sum].grade;
stu[i+sum].id = j;
}
//sort(stu+sum+1, stu+sum+n+1, cmp);
Qsort(sum+1, sum+n);
int pre = stu[sum+1].grade, prerank = 1;
for(int i = 1; i <= n; i++){
if(stu[i+sum].grade == pre){
stu[i+sum].idrank = prerank;
}
else{
prerank=i;
stu[i+sum].idrank = prerank;
pre = stu[i+sum].grade;
}
}
sum += n;
}
//sort(stu+1, stu+sum+1, cmp);
Qsort(1, sum);
int pre = stu[1].grade, prerank = 1;
stu[1].ranks = 1;
for(int i = 2; i <= sum; i++){
if(stu[i].grade == pre){
stu[i].ranks = prerank;
}
else{
prerank=i;
stu[i].ranks = prerank;
pre = stu[i].grade;
}
}
cout<<sum<<endl;
for(int i = 1; i <= sum; i++){
cout<<stu[i].num<<" "<<stu[i].ranks<<" "<<stu[i].id<<" "<<stu[i].idrank<<endl;
}
return 0;
}
建议学学快排 冒泡
最快的是timsort
Qsort建议不要用
很难理解的
我学了三四节课放弃了