2338: 【基础】小X算排名(1542)
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:10
解决:8
题目描述
小 很关心自己在学校的表现。
班主任手上有一本“个人得分记录本”,如果一位同学表现好就会加分,表现差则会扣分。学期结束,每位同学都得知了自己的个人得分。小 想知道其他同学情况如何,但由于排名不公布,他只好一个个去问班里的其他同学。
现在,小 手上有班里共 位同学的个人得分,他想知道每位同学的排名 (得分相同则排名相同,见样例),可并不知道该如何计算,希望你帮帮他。
输入
第一行包含一个整数 。
接下来 行,第 行包含一个整数 ,表示第 位同学的得分。
输出
行,第 行包含一个整数,表示第 位同学的排名。
样例输入 复制
5
95
100
99
99
96
样例输出 复制
5
1
2
2
4
提示
数据范围
对于 的数据,。
对于 的数据,。
对于 的数据,,。
【注意】
由于本题读入、输出的数据较多,C++选手请使用scanf和printf 替代 cin和cout 提升读写效率。
#include<bits/stdc++.h>
using namespace std;
map<int,int,greater<int> > m;
int n,i,c=0,a[100100],t;
int main(){
cin>>n;
for(i=0;i<n;i++) {
scanf("%d",&a[i]);
m[a[i]]++; //不同分数的人数
}
map<int,int>::iterator it;
for(it=m.begin();it!=m.end();it++) {
t=it->second;
m[it->first]=c+1; //不同分数的名次=在此分数前的人数总和+1
c=c+t;
}
for(i=0;i<n;i++)
printf("%d\n",m[a[i]]);
return 0;
}