几周前,一家著名软件公司升级了即时通讯软件。用户组发布了一个排名系统。一个小组的每个成员都有一个位于他的昵称附近的等级。级别显示组中成员的活动程度。
每个成员都有一个基于分数的行为。通过这种方法确定水平:
水平 | 百分比 | 此级别的成员数目 |
---|---|---|
LV1 | / | 所有得分均为零的成员 |
LV2 | / | 所有不能达到3级以上但具有正分数的成员 |
LV3 | 30% | ⌊(具有正分数的成员的数量) * 30%⌋ |
LV4 | 20% | ⌊(具有正分数的成员的数量) * 20%⌋ |
LV5 | 7% | ⌊(具有正分数的成员的数量) * 7%⌋ |
LV6 | 3% | ⌊(具有正分数的成员的数量) * 3%⌋ |
[x]是小于或等于 x的最大整数。
得分越高的会员越高。如果两个成员有相同的分数,那么加入组的较早的成员将得到更高的水平。如果仍然存在关联,较小ID的用户将得到更高的级别。
请编写一个程序来计算组中每个成员的级别。
输入:
有多个测试用例。输入的第一行是指示测试用例个数的整数T。对于每个测试用例:
第一行包含一个整数N(1<N<=2000),表示一个组中成员的数目。
下n行,每行包含三个部分(由一个空间分隔):
第i个成员Ai的ID(0 <=Ai <=1000000000)。每个成员的ID是唯一的。
第i个成员加入该集团的日期,格式为YYYY/MM/DD。日期将在[ 1900 / 01 / 01, 2014 / 04 / 06 ]的范围内。
第i个成员的分数Si(0<Si=9999)。
输出:
对于每个测试用例,输出N行。每行包含一个字符串,表示第i个成员的级别。
样本输入:
1
5
123456 2011/03/11 308
123457 2011/03/12 308
333333 2012/03/18 4
555555 2014/02/11 0
278999 2011/03/18 308
样本输出:
LV3
LV2
LV2
LV1
LV2
代码如下:
#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;
}