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:
| Level | Percentage | The number of members in this level |
|---|---|---|
| LV1 | / | All members whose score is zero |
| LV2 | / | All members who can not reach level 3 or higher but has a positive score |
| LV3 | 30% | ?(The number of members with a positive score) * 30%? |
| LV4 | 20% | ?(The number of members with a positive score) * 20%? |
| LV5 | 7% | ?(The number of members with a positive score) * 7%? |
| LV6 | 3% | ?(The number of members with a positive score) * 3%? |
Please write a program to calculate the level for each member in a group.
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):
For each test case, output N lines. Each line contains a string represents the level of the i-th member.
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
一开始比赛的时候我没去做这道题,因为好像看起来很复杂的样子,而且竟然还有表格这种东西。
后来发现挺简单的,嗨,那就去A了,可是竟然一个小问题卡了我n久,而且是因为把小数点写成了‘,‘ 导致一直WA,醉了,还是不够仔细啊。
题目的大致意思是:
叫你按照等级排序:
首先按照分数来排,若分数相同则按照时间来排,再其次则按照ID来排;
然后叫你输出每个人的LV是多少。
那么就相当于是一个三级排序的变式。毕竟只有6中level,所以把每一个等级的人数算出来然后依次排序就好了。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int x; //保存了序号;
int id;
int yy,mm,dd;
int s;
}a[2005];
bool cmp(node a,node b){
if(a.s!=b.s) return a.s>b.s;
if(a.s==b.s){
if(a.yy==b.yy && a.mm==b.mm) return a.dd<b.dd;
if(a.yy==b.yy) return a.mm<b.mm;
return a.yy<b.yy;
}
return a.id<b.id;
}
int main(){
int T,n,sum,k,i,j;
int f[2005];
scanf("%d",&T);
while(T--){
memset(a,0,sizeof(a)); memset(f,0,sizeof(f));
scanf("%d",&n);
sum=0;
for(i=1;i<=n;i++){
scanf("%d %d/%d/%d %d",&a[i].id,&a[i].yy,&a[i].mm,&a[i].dd,&a[i].s);
a[i].x=i;
//sum是记录大于0的人数;
if(a[i].s>0) sum++;
}
int d6,d5,d4,d3;
sort(a+1,a+1+n,cmp);
d6=sum*0.03; d5=sum*0.07; d4=sum*0.2; d3=sum*0.3;
for(i=1;i<=n;i++){
if(!a[i].s) f[a[i].x]=1;
else if(d6) {f[a[i].x]=6; d6--; }
else if(d5) {f[a[i].x]=5; d5--; }
else if(d4) {f[a[i].x]=4; d4--; }
else if(d3) {f[a[i].x]=3; d3--; }
else {f[a[i].x]=2; }
}
for(i=1;i<=n;i++){
printf("LV%d\n",f[i]);
}
}
}
另外,在我的验证下,那个id用字符串类型保存也是可以的,
并且在比较的时候直接写 a.id<b.id; 也是可以来判断的;
原文地址:http://blog.csdn.net/acmer_hades/article/details/44201091