OJ周赛第二场——排名

排名
 

问题描述 

有一个n个人的班级。

你知道每个人的成绩,需要输出每个人的排名。

 

输入 

第一行一个整数n。(1≤n≤10^5)

第二行n个数,表示每个人的成绩c。(1≤c≤10^9)

输出 

输出n个数,表示每个人的排名

 

输入例子 1 

6
3 5 4 2 5 3

输出例子 1

4 1 3 6 1 4

 

提示:

比较经典的对分数离散化。

但是离散化一般是从小到大的,所以一开始先全取负。

将分数排序,然后原序列再逐个在排序后的数组上二分。

推荐写c++,直接用stl的lower_bound即可。

 

答案:

#include<bits/stdc++.h>
using namespace std;

signed main(){
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    
    int n;cin>>n;
    vector<int> a(n);
    for (int i=0;i<n;++i){
        cin>>a[i];
        a[i]=-a[i];
    }
    
    auto b=a;
    sort(b.begin(),b.end());
    for (int i=0;i<n;++i) 
       cout<<lower_bound(b.begin(),b.end(),a[i])-b.begin()+1<<' ';
     
    return 0-0;
}

 

posted @ 2022-11-07 15:28  嘻哈磕碜  阅读(21)  评论(0编辑  收藏  举报