ZOJ3770Ranking System

    xiaoxiao2021-04-17  37

    Ranking System
    Time Limit: 2 Seconds       Memory Limit: 65536 KB

    Few weeks ago, a famous software company has upgraded its instant messaging software. A ranking system was released for user groups. Each member of a group has a level placed near his nickname. The level shows the degree of activity of a member in the group.

    Each member has a score based his behaviors in the group. The level is determined by this method:

    LevelPercentageThe number of members in this levelLV1/All members whose score is zeroLV2/All members who can not reach level 3 or higher but has a positive scoreLV330%⌊(The number of members with a positive score) * 30%⌋LV420%⌊(The number of members with a positive score) * 20%⌋LV57%⌊(The number of members with a positive score) * 7%⌋LV63%⌊(The number of members with a positive score) * 3%⌋ ⌊x⌋ is the maximum integer which is less than or equal to x.The member with the higher score will get the higher level. If two members have the same score, the earlier one who joined the group will get the higher level. If there is still a tie, the user with smaller ID will get the higher level.

    Please write a program to calculate the level for each member in a group.

    Input

    There are multiple test cases. The first line of input is an integer T indicating the number of test cases. For each test case:

    The first line contains an integer N (1 <= N <= 2000) indicating the number of members in a group.

    The next N lines, each line contains three parts (separated by a space):

    The ID of the i-th member Ai (0 <= Ai <= 1000000000). The ID of each member is unique.The date of the i-th member joined the group, in the format of YYYY/MM/DD. The date will be in the range of [1900/01/01, 2014/04/06].The score Si (0 <= Si <= 9999) of the i-th member.

    Output

    For each test case, output N lines. Each line contains a string represents the level of the i-th member.

    Sample Input

    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

    Sample Output

    LV3 LV2 LV2 LV1 LV2
    题目的意思是给出每个等级的定义,在根据定义输出每个人的等级

    思路:先统计出几个0分的,在排序之后按比例划分

    #include <iostream> #include<queue> #include<cstdio> #include<algorithm> #include<cmath> #include<set> #include <cstring> using namespace std; #define LL long long struct node { int id,no,y,m,d,v,lv; } p[100005]; bool cmp(node a,node b) { if(a.v!=b.v) return a.v>b.v; if(a.y!=b.y) return a.y<b.y; if(a.m!=b.m) return a.m<b.m; if(a.d!=b.d) return a.d<b.d; return a.no<b.no; } bool cmp2(node a,node b) { return a.id<b.id; } int main() { int T,n; scanf("%d",&T); while(T--) { scanf("%d",&n); int tot=0; for(int i=0; i<n; i++) { p[i].id=i; scanf("%d %d/%d/%d %d",&p[i].no,&p[i].y,&p[i].m,&p[i].d,&p[i].v); if(p[i].v==0) tot++,p[i].lv=1; } sort(p,p+n,cmp); tot=n-tot; int cnt=0; for(int i=1; i<=tot*0.03; i++) p[cnt++].lv=6; for(int i=1; i<=tot*0.07; i++) p[cnt++].lv=5; for(int i=1; i<=tot*0.20; i++) p[cnt++].lv=4; for(int i=1; i<=tot*0.30; i++) p[cnt++].lv=3; while(p[cnt].v>0) p[cnt++].lv=2; sort(p,p+n,cmp2); for(int i=0; i<n; i++) printf("LV%d\n",p[i].lv); } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-673737.html

    最新回复(0)