题目描述
小 X 很关心自己在学校的表现。
班主任手上有一本“个人得分记录本”,如果一位同学表现好就会加分,表现差则会扣分。学期结束,每位同学都得知了自己的个人得分。小 X 想知道其他同学情况如何,但由于排名不公布,他只好一个个去问班里的其他同学。
现在,小 X 手上有班里共 N 位同学的个人得分,他想知道每位同学的排名 (得分相同则排名相同,见样例),可并不知道该如何计算,希望你帮帮他。
输入
第一行包含一个整数 NN 。
接下来 N 行,第 i 行包含一个整数 Ai,表示第 i 位同学的得分。
输出
N 行,第 i 行包含一个整数,表示第 i 位同学的排名。
样例:
输入:
5
95
100
99
99
96
输出:
5
1
2
2
4
代码如下:
1、自定义函数法(如果你不知道什么是自定义函数的话,推荐你去看 自定义函数(无返回值)打法及参考例题(附答案)【喜欢请点赞】)
#include <bits/stdc++.h>
using namespace std;
int a[100100],b[100100];
int n;
bool cmp(int x,int y)
{
return x>y;
}
int fun(int x)
{
int l=1,r=n,mid;
while(l<=r)
{
mid=l+r>>1;
if(x==b[mid]&&b[mid-1]>x)return mid;
else if(x>=b[mid])r=mid-1;
else l=mid+1;
}
return mid;
}
int main() {
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+n+1,cmp);//sort排序
for(int i=1;i<=n;i++)
{
printf("%d\n",fun(a[i])) ;
}
return 0;
}
2、前缀和法
#include<bits/stdc++.h>
using namespace std;
long long n,a[1000005],b[1000005];//注:一定要搞long long
int main(){
scanf("%d",&n);//注:一定要搞scanf
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[a[i]]++;
}
for(int i=1;i<=1000005;i++)
b[i]=b[i]+b[i-1];
for(int i=1;i<=n;i++)
printf("%d\n",b[1000005]-b[a[i]]+1);//注:一定要搞printf
return 0;
}