模拟。
分数为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;
}