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; }