说明
小X很关心自己在学校的表现。
班主任手上有一本“个人得分记录本”,如果一位同学表现好就会加分,表现差则会扣分。学期结束,每位同学都得知了自己的个人得分。小X想知道其他同学情况如何,但由于排名不公布,他只好一个个去问班里的其他同学。
现在,小X手上有班里共N位同学的个人得分,他想知道每位同学的排名 (得分相同则排名相同,见样例),可并不知道该如何计算,希望你帮帮他。
输入格式
第一行包含一个整数N。
接下来N行,第i行包含一个整数Ai,表示第i位同学的得分。
输出格式
N行,第i行包含一个整数,表示第i位同学的排名。
样例
输入数据 1
5
95
100
99
99
96
输出数据 1
5
1
2
2
4
提示
数据范围
对于30%的数据,N≤10。
对于60%的数据,N≤1000。
对于 100%的数据,1≤N≤100000,0≤Ai≤100000。
#include<bits/stdc++.h>
using namespace std;
//从大到小排序,二分查找左边界 over
const int N=1e7;
int a[N],b[N];
int findl(int *a,int key,int len){
int l=1,r=len;
while(l<=r){
int mid=(l+r)>>1;
if(a[mid]==key) r=mid-1;
else if(a[mid]<key) r=mid-1;
else if(a[mid]>key) l=mid+1;
}
return l;
}
bool cmp(int x,int y){
return x>y;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
cout<<findl(a,b[i],n)<<endl;//别写错了,是在a数组里面查找,wa很多次才发现QAQ
}
return 0;
}