ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

HNUST OJ 2211 Ranking

2021-12-21 13:01:54  阅读:184  来源: 互联网

标签:分数 Ranking 2211 level rank HNUST 排名 交卷 1000


问题 H: Ranking
时间限制: 1 Sec  内存限制: 128 MB


题目描述

又到了百变联盟举行IQ测试比赛的时候了,这次的参赛者是来自玫瑰王国、白雪王国、黄金王国、白马王国、沙漠王国的众多好手。由于这次比赛参与人数众多,为了区分出选手的水平,主办方煞费苦心地准备了1000道题,每道题的分数是1000分,所以满分是1000000分(啊好难,我不参加了)。但是以前经常有选手爆零,出现尴尬的0分的场面,因此主办方决定报名参加比赛就是1分,即选手们的分数是1到1000000分(啊好“良心”)。 
因为参加人数众多,主办方为了对人才进行分类,把分数分成了1000个level,1到1000分属于level1,1001到2000分属于level2…最后999001到1000000分属于level1000。最令人意外的是,这次主办方请了聪明的GG Bond作为评委。 
但是历届比赛还没颁奖完,知道自己没获奖的人就走光了。今年为了防止出现这一尴尬场面和提高颁奖的紧张刺激性,因此GG Bond决定采取类似滚榜的形式。今年比赛只会根据交卷的先后顺序显示实时分数排名(当分数相同时排名一样)和其level_rank。 
即A在10:00交卷,那A只能知道在10:00交卷前的所有人中,他的实时分数排名和他的level_rank。而A想要知道最终的分数排名只能等待所有人交卷完。 
对于A的level_rank定义为:在A交卷前有多少个比A的分数level高的level出现过。 
例如: 有A,B,C,D四个人依次交卷,分数依次为5000,8000,5000,1000。A先交卷分数为5000属于level5,其分数排名为第1名并且level_rank为0。到B交卷分数为8000属于level8,其分数排名为第1名并且level_rank为0,因为前面没有大于level8的level出现过。到C交卷时分数为5000属于level5,而前面因为有level8出现过,因此其分数排名为第2名并且level_rank为1。而到D交卷时分数为1000属于level1,前面有level5和level8出现过,因此D的分数排名为4并且level_rank为2。 
GG Bond也同时负责了这一分数排名和level_rank的计算,但是他不会编程,你能帮他解决这个问题吗? 

输入

第一行包含一个数字n(n <= 10000), 表示参加比赛的人数。 
接下来n行,第i行表示第i个交卷的人的分数a[i](1<=a[i] <= 1000000)。  

输出

输出n行,第i行表示第i个交卷的人的level_rank和实时分数排名。 

样例输入
4
5000
8000
5000
1000

样例输出
0 1
0 1
1 2
2 4

思路

1. 题目很长,但别被题目吓到,还是很简单的

2. 一个分数的level可以用这个分数加999再除以1000来计算

3.实时排名就是看比这个分数高的有多少个,再加上1

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[10001],level[1001];
int main(){
    int N,score_rank,level_rank,max=0;
    scanf("%d",&N);
    for (int i = 0 ; i < N ; i++) {
        score_rank = 1 ;
        level_rank = 0 ;
        //输入成绩
        scanf("%d",&a[i]);
        //获取等级
        level[(a[i] + 999)/1000] = 1 ;
        //计算最大分数
        max = max >= a[i] ? max : a[i] ;
        //计算实时排名
        for (int j = 0 ; j <= i ; j++) {
            if (a[i] < a[j]) {
                score_rank++ ;
            }
        }
        //计算level_rank
        for (int j = (max + 999)/1000 ; j > (a[i] + 999)/1000 ; j--) {
                level_rank += level[j] ;
        }
        //输出
        printf("%d %d\n",level_rank,score_rank);
    }
    return 0;
}
 
/**************************************************************
    Problem: 2211
    User: 21XXXXXXXX
    Language: C++
    Result: 正确
    Time:279 ms
    Memory:2064 kb
****************************************************************/

标签:分数,Ranking,2211,level,rank,HNUST,排名,交卷,1000
来源: https://blog.csdn.net/qq_30777847/article/details/122059414

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有