ZOJ 3770 Ranking System(模拟)

题目链接:ZOJ 3770 Ranking System

模拟。

分数为0的人都是lv1,lv3到lv6的人数与群内有分数的人乘以某个百分比的向下取整有关,所以高等级的人不一定存在,因为取整后有可能为0,剩下的人都是lv2的。输入完后处理好各个排名各有多少人。0表示这个群内暂时没有这个等级的人存在。

那么怎么确定谁比谁的排名靠前呢,题目中给了一套比较逻辑:先比较分数,分数越高排名越高,分数相同比较进群时间,时间越早排名越高(这里体现出scanf输入格式控制的优势了),前两项都相同的话比较id,id越小等级越高。

之后把排名和等级对应起来。

最后按照输入顺序输出。

#include <iostream>
#include <map>
#include <stdio.h>
#include <algorithm>

using namespace std;

const int MAX_N = 2000 + 100;
int n, T, cnt;
struct Rank
{
    int ymd;
    int score;
    int id;
    string lv;
};
int y, m, d, id, score;
Rank r[MAX_N];
int a[MAX_N];
int cmp(int m, int n)
{
    if(r[m].score != r[n].score)
        return r[m].score > r[n].score;
    else if(r[m].score == r[n].score)
    {
        if(r[m].ymd != r[n].ymd)
            return r[m].ymd < r[n].ymd;
        else if(r[m].ymd == r[n].ymd)
            return r[m].id < r[n].id;
    }
}
int lv[6];

int main()
{
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);
        int cnt = 0;
        for(int i = 0; i < n; i++)
        {
            scanf("%d %d/%d/%d %d", &r[i].id, &y, &m, &d, &r[i].score);
            r[i].ymd = y * 10000 + m * 100 + d;
            a[i] = i;
            if(r[i].score != 0)
                cnt++;
        }
        sort(a, a + n, cmp);
        lv[6] = (int)(cnt * 0.03);
        lv[5] = (int)(cnt * 0.07);
        lv[4] = (int)(cnt * 0.2);
        lv[3] = (int)(cnt * 0.3);
        lv[2] = cnt - lv[6] - lv[5] - lv[4] - lv[3];
        lv[1] = n - cnt;
        for(int i = 0; i < n; i++)
        {
            if(lv[6] != 0)
            {
                r[a[i]].lv = "LV6";
                lv[6]--;
            }
            else if(lv[5] != 0)
            {
                r[a[i]].lv = "LV5";
                lv[5]--;
            }
            else if(lv[4] != 0)
            {
                r[a[i]].lv = "LV4";
                lv[4]--;
            }
            else if(lv[3] != 0)
            {
                r[a[i]].lv = "LV3";
                lv[3]--;
            }
            else if(lv[2] != 0)
            {
                r[a[i]].lv = "LV2";
                lv[2]--;
            }
            else
                r[a[i]].lv = "LV1";
        }
        for(int i = 0; i < n; i++)
            cout << r[i].lv << endl;
    }
    return 0;
}


你可能感兴趣的:(ZOJ 3770 Ranking System(模拟))