问题背景
老韩让书名号出一道普通题,于是他出了nn道题(1−n)(1−n),让鱼人们去做,并让它们给出每道题的普通指数aiai,你能帮帮书名号,帮他把题目按照普通度排序么? 与上次不同的是,如果普通指数相同,你需要按照编号从大到小排列。
输入格式
第一行一个整数nn,代表题目的数量。 第二行nn个数字,代表每道题的普通指数。
输出格式
一行nn个数,代表排序好的题目编号(请不要在末尾留空格)
样例一
input
5
1 2 3 3 4
output
1 2 4 3 5
数据范围与约定
对于 10%的数据,普通指数不存在重复。 对于 20%的数据,n<=1000n<=1000。 对于 70%的数据,n<=10000n<=10000。 对于 100% 的数据,ai<=10000ai<=10000, n<=200000n<=200000,aiai 与 nn 都为正数。
时间限制: 1s1s
内存限制: 256MB256MB
提示
这是一道双关键字排序题,用桶其实也可以
题目来源:
C++ 语言基础测试
老韩第一次教sort
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
struct item{
int ai, no;
};
bool cmp(item a, item b){
if(a.ai<b.ai) return true;
if(a.ai>b.ai) return false;
if(a.ai==b.ai){
if(a.no<b.no) return false;
else return true;
}
}
int n;
item d[200010];
int main(){
scanf("%d", &n);
for(int i=1; i<=n; i++){
scanf("%d", &d[i].ai);
d[i].no=i;
}
sort(d+1, d+n+1, cmp);
for(int i=1; i<n; i++)
printf("%d ", d[i].no);
printf("%d\n", d[n].no);
return 0;
}
这个函数需要用到#include
using namespace std;
原来觉得自己懂了cmp的用法,但是今天做题,因为cmp函数一直WA,所以又查了查关于cmp的用法。
然后准备写下来自己的想法,避免以后在此忘记。
格式为
bool cmp(T ,x, T y)
{
if(x>y)
return 1;
else
return 0;
}
如果0, 那么函数就会将他们互换位置, 1就会保持原来位置不变。
返回类型如果是Bool类型的话 就是true=1,false=0;
如果返回是0的话,那么它就会交换位置,如果是1,代表不需要动。
sort 函数集锦
头文件:
语法:
sort(指针first, 指针last);
sort(指针first, 指针last, 比较函数cmp);
区间[first, last)之间的元素被升序排序
比较函数cmp需要实现“<”判断规则
sort时间复杂度逼近nlogn
sort排序是不稳定的
stable_sort()
实现稳定的排序
使用方法同sort()
reverse()
语法:
reverse(指针first, 指针last);
将区间[first, last)内的元素逆序重放。
reverse_copy()
语法:
reverse(指针first, 指针last, 指针result);
将区间[first, last)内的元素逆序并重新放置在指针result指向的空间内。
copy()
语法:
copy(指针first, 指针last, 指针result);
将区间[first, last)内的元素顺序拷贝到指针result指向的空间内。
copy_backward()
语法:
copy_backward(指针first, 指针last, 指针result);
将区间[first, last)内的元素逆序拷贝到以指针result结尾的空间内。
应用:批量移动(后移)元素
fill()
语法:
fill(指针first, 指针last, val);
将区间[first, last)内的元素全部置为val。
fill_n()
语法:
fill_n(指针start, Size n, val);
将指针start开始的空间的前n个元素的值置为val。