22/7每日一题acm

几周前,一家著名软件公司升级了即时通讯软件。用户组发布了一个排名系统。一个小组的每个成员都有一个位于他的昵称附近的等级。级别显示组中成员的活动程度。

每个成员都有一个基于分数的行为。通过这种方法确定水平:

水平百分比此级别的成员数目
LV1/所有得分均为零的成员
LV2/所有不能达到3级以上但具有正分数的成员
LV330%⌊(具有正分数的成员的数量) * 30%⌋
LV420%⌊(具有正分数的成员的数量) * 20%⌋
LV57%⌊(具有正分数的成员的数量) * 7%⌋
LV63%⌊(具有正分数的成员的数量) * 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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值