2338: 【基础】小X算排名(1542)

内存限制:128 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:10 解决:8

题目描述

小 lns="http://www.w3.org/1998/Math/MathML"> 很关心自己在学校的表现。

班主任手上有一本“个人得分记录本”,如果一位同学表现好就会加分,表现差则会扣分。学期结束,每位同学都得知了自己的个人得分。小 lns="http://www.w3.org/1998/Math/MathML"> 想知道其他同学情况如何,但由于排名不公布,他只好一个个去问班里的其他同学。

现在,小 lns="http://www.w3.org/1998/Math/MathML"> 手上有班里共 lns="http://www.w3.org/1998/Math/MathML"> 位同学的个人得分,他想知道每位同学的排名 (得分相同则排名相同,见样例),可并不知道该如何计算,希望你帮帮他。

输入

第一行包含一个整数 lns="http://www.w3.org/1998/Math/MathML"> 。

接下来 lns="http://www.w3.org/1998/Math/MathML"> 行,第 lns="http://www.w3.org/1998/Math/MathML"> 行包含一个整数 lns="http://www.w3.org/1998/Math/MathML">,表示第 lns="http://www.w3.org/1998/Math/MathML"> 位同学的得分。

输出

 行,第 lns="http://www.w3.org/1998/Math/MathML"> 行包含一个整数,表示第 lns="http://www.w3.org/1998/Math/MathML"> 位同学的排名。

样例输入 复制

5
95
100
99
99
96

样例输出 复制

5
1
2
2
4

提示

数据范围

对于 lns="http://www.w3.org/1998/Math/MathML">30% 的数据,lns="http://www.w3.org/1998/Math/MathML">10

对于 lns="http://www.w3.org/1998/Math/MathML">60% 的数据,lns="http://www.w3.org/1998/Math/MathML">1000

对于 lns="http://www.w3.org/1998/Math/MathML">100% 的数据,lns="http://www.w3.org/1998/Math/MathML">1100000lns="http://www.w3.org/1998/Math/MathML">0100000

【注意】

由于本题读入、输出的数据较多,C++选手请使用scanfprintf 替代 cincout 提升读写效率。


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