问题标题: 酷町堂:5567 成绩排名(score)

0
0
已解决
张恩泽
张恩泽
高级天翼
高级天翼

5567   成绩排名(score) 经验值:800

不许抄袭,一旦发现,直接清空经验!

题目描述 Description

某次信息学测试一共有4道题目,每题有10个测试点,每个测试点10分,学生得分肯定都是整数,最多400分,最少0分。现给出本次测试n个同学的成绩,请统计输出每个同学前面有多少人分数比他高。

输入描述 Input Description

共2行。第一行一个正整数n;第二行n个用空格隔开的整数,表示每个同学的成绩。

输出描述 Output Description

一行,n个整数,第i个表示第i位同学前面比他分数高的人数。

样例输入 Sample Input

10 220 100 400 360 180 250 300 400 200 190

样例输出 Sample Output

0 1 0 1 3 2 2 0 6 7

数据范围及提示 Data Size & Hint

第1个同学220分,他前面有0人比他分数高;第2个同学100分,他前面有1人比他分数高,即考了220的人;第3个同学400分,他前面有0人比他分数高;……;第10个同学190分,他前面有7人比他分数高,即考了220分、400分、360分、250分、300分、400分和200分的7个人。
数据范围:
80%的数据1<=n<=1000
100%的数据1<=n<=100000

 

//CODE
#pragma GCC optimize(3)
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
using namespace std;
int n, a[100005], cnt[100005];
int main() {
//	freopen ("题目名.in", "r", stdin);
//	freopen ("题目名.out", "w", stdout);
	scanf ("%d", &n);
	for (int i = 1; i <= n; i ++) {
		scanf ("%d", &a[i]);
	}
	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j < i; j ++) {
			if (a[j] > a[i]) {
				cnt[i] ++;
			}
		}
	}
	for (int i = 1; i <= n; i ++) {
		printf ("%d ", cnt[i]);
	}
//	fclose (stdin);
//	fclose (stdout);
	return 0;//好习惯!
} 

为何90,最后一个点TLE

还有,我用cin cout最后一个点是1980毫秒,用scanf printf最后一个点居然是1988毫秒!

张恩泽在2020-10-30 19:19:17追加了内容

我顶!


0
已采纳
荣光峰
荣光峰
资深光能
资深光能

用桶做:

for(int i=1;i<=n;i++){
        cin>>a[i];
        b[a[i]]++;
        int c=0;
        for(int j=400;j>a[i];j--){
            if(b[j]!=0){
                c+=b[j];
            }
        }
        cout<<c<<" ";
    }

前面加定义

0
曹灿阳
曹灿阳
初级天翼
初级天翼

用桶,每一次输入完一个分数,就遍历从400~这个分数+1有多少个,并输出

我要回答