问题描述
采儿是一位负责一班名学生的老师。 这些学生的学号是从1到,且各不相同。 今天,所有学生以不同的时间进入教室。 根据高桥的记录,当学号为的学生进入教室时(包括学号为的学生在内),教室里有名学生。(该同学进班时有几名同学,说明该同学第几个到的)根据这些记录,重构学生进入教室的顺序。
约束条件
• 1≤≤105
• 1≤≤
• ≠(≠)
• 输入中的所有值均为整数。
输入
输入以以下格式从标准输入给出:
1 2 …
输出
按照学生进入教室的顺序打印学生的学号,学号之间保留一个空格。
样例
Input 3 Output 3 1 2
2 3 1
Input 7 Output 7 6 4 5 3 2 1
7 6 5 3 4 2 1
注意:这个题的关键在于理解每个同学进入教室时教室里的人数与他们进入顺序之间的关系
法一(结构体快排法)本法在学生数量较大时也很快
C语言版
#include
int compare(const void *a,const void *b);
struct number{
int a;
int b;
}student[100000],mid;
int main()
{
int n;
scanf("%d",&n);
for(int i=0;ib - b1->b ;
}
qsort的用法:有四个参数,qsort(数组名,数组元素个数,数组元素字节大小,比较函数)
比较函数传入两个指针,(个人理解)前面的指针传入的元素下标较小,后面的
指针传入的元素下标较大。compare返回值>0时,两元素交换;否则不交换。
C++版
#include
#include
#include
struct Number {
int a;
int b;
};
bool compare(const Number& a, const Number& b) {
return a.b < b.b;
}
int main() {
int n;
std::cin >> n;
std::vector student(n);
for (int i = 0; i < n; i++) {
student[i].a = i + 1;
std::cin >> student[i].b;
}
std::sort(student.begin(), student.end(), compare);
for (int i = 0; i < n; i++) {
std::cout << student[i].a << (i != n - 1 ? ' ' : '\n');
}
return 0;
}
法二(双数组法)
C++版
若人数太多,本法会时间超限
#include
using namespace std;
int arr1[100000],arr2[100000];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i0;i--)
{
for(int j=0;jarr2[j+1])
{
int mid1,mid2;
mid1=arr1[j];
mid2=arr2[j];
arr1[j]=arr1[j+1];
arr2[j]=arr2[j+1];
arr1[j+1]=mid1;
arr2[j+1]=mid2;
}
}
}
for(int i=0;i