hdu 5499 SDOI 【BestCoder Round #59 (div.2) 】

来源:互联网 发布:人工蜂群算法的流程图 编辑:程序博客网 时间:2024/05/22 08:16

SDOI

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 298    Accepted Submission(s): 117


Problem Description
The Annual National Olympic of Information(NOI) will be held.The province of Shandong hold a Select(which we call SDOI for short) to choose some people to go to the NOI. n(n100) people comes to the Select and there is m(m50) people who can go to the NOI.

According to the tradition and regulation.There were two rounds of the SDOI, they are so called "Round 1" and "Round 2", the full marks of each round is 300.

All the n people take part in Round1 and Round2, now the original mark of every person is known. The rule of SDOI of ranking gets to the "standard mark". For each round there is a highest original mark,let's assume that is x.(it is promised that not all person in one round is 0,in another way,x>0). So for this round,everyone's final mark equals to his/her original mark(300/x).

After we got everyone's final mark in both round.We calculate the Ultimate mark of everyone as 0.3round1s final mark + 0.7round2s final mark.It is so great that there were no two persons who have the same Ultimate mark.

After we got everyone's Ultimate mark.We choose the persons as followed:

To encourage girls to take part in the Olympic of Information.In each province,there has to be a girl in its teams.

1. If there is no girls take part in SDOI,The boys with the rank of first m enter the team.
2. If there is girls, then the girl who had the highest score(compared with other girls) enter the team,and other(boys and other girls) m-1 people with the highest mark enter the team.

Just now all the examination had been finished.Please write a program, according to the input information of every people(Name, Sex ,The original mark of Round1 and Round2),Output the List of who can enter the team with their Ultimate mark decreasing.
 

Input
There is an integer T(T100) in the first line for the number of testcases and followed T testcases.

For each testcase, there are two integers n and m in the first line(nm), standing for the number of people take part in SDOI and the allowance of the team.Followed with n lines,each line is an information of a person. Name(A string with length less than 20,only contain numbers and English letters),Sex(male or female),the Original mark of Round1 and Round2 (both equal to or less than 300) separated with a space.

 

Output
For each testcase, output "The member list of Shandong team is as follows:" without Quotation marks.

Followed m lines,every line is the name of the team with their Ultimate mark decreasing.
 

Sample Input
210 8dxy male 230 225davidwang male 218 235evensgn male 150 175tpkuangmo female 34 21guncuye male 5 15faebdc male 245 250lavender female 220 216qmqmqm male 250 245davidlee male 240 160dxymeizi female 205 1902 1dxy male 300 300dxymeizi female 0 0
 

Sample Output
The member list of Shandong team is as follows:faebdcqmqmqmdavidwangdxylavenderdxymeizidavidleeevensgnThe member list of Shandong team is as follows:dxymeiziHintFor the first testcase: the highest mark of Round1 if 250,so every one's mark times(300/250)=1.2, it's same to Round2.The Final of The Ultimate score is as followedfaebdc 298.20qmqmqm 295.80davidwang 275.88dxy 271.80lavender 260.64dxymeizi 233.40davidlee 220.80evensgn 201.00tpkuangmo 29.88guncuye 14.40For the second testcase,There is a girl and the girl with the highest mark dxymeizi enter the team, dxy who with the highest mark,poorly,can not enter the team.
 


题目大意:

问题描述
一年一度的全国信息学奥林匹克竞赛(NOI)即将举办,SD省组织进行了一次省队选拔,一共有 n (n \leq 100)n(n100)名选手参加了这次省队选拔。今年,SD省的省队名额为 m (m \leq 50)m(m50) 人,即,今年的SD省队有 mm 名队员。按照惯例,SD省的省队选拔有两轮比赛,依次为“Round1”和“Round2”,每个Round的满分为 300300 分。所有 n 名选手都参加了Round1和Round2,现在每名选手Round1和Round2的“原始得分”已经确定。SD省的省队选拔采用标准分计算方式,即,设某个Round的最高原始得分为 xx 分(保证每轮比赛都不会全场零分,即x>0x>0),那么此Round每名选手的“相对得分”为: 这名选手此Round的原始得分* (300 / x)(300/x)。所有选手的Round1和Round2的相对得分计算完毕后,将计算每名选手的“最终成绩”。一名选手的最终成绩为:这名选手的Round1相对得分* 0.30.3 + 这名选手的Round2相对得分* 0.70.7。非常和谐的是,保证不存在两名选手的最终成绩相等。所有选手的最终成绩计算完毕后,将会按照以下规则选出省队队员:为了鼓励女生参加信息学奥赛及相关活动,在有女选手参加省队选拔的情况下,省队中有一个固定的女选手名额。1)若没有女选手参加省队选拔,则最终成绩最高的 mm 位选手进入省队。2)若有女选手参加省队选拔,则最佳女选手(女选手中最终成绩最高者)进入省队,其余的选手(男选手和最佳女选手之外的女选手)中成绩最高的 m-1m1 位选手进入省队。现在已经到了省队选拔的最后阶段,请你编写一个程序,根据输入的所有选手的信息(姓名,性别,Round1和Round2的原始得分),输出进入省队的选手的姓名,输出的姓名按照省队队员的最终成绩降序(从高到低)排列。
官方题解:

直接按照题意计算出最后每名选手的最终得分,接着按最终得分排序。

先找出来一个得分最高的女生,然后找出其余的选手中得分最高的m-1m1个人,把所有进入省队的选手再按分数重新排一下序,最后输出即可。

我的思路:
其实跟官方的题解没什么区别,就是用两个标记变量分别记录有没有女生和如果女生的分数
 #include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <vector>#include <queue>#include <algorithm>#include <set>using namespace std;#define MM(a) memset(a,0,sizeof(a))typedef long long LL;typedef unsigned long long ULL;const int maxn = 1e2+5;const int mod = 1000000007;const double eps = 1e-7;struct node{    double rnd1,rnd2;    char name[25];    char sex[25];    double ave;} arr[maxn];bool cmp(node a, node b){    return a.ave > b.ave;}int main(){    int T, m, n;    cin>>T;    while(T--)    {        cin>>m>>n;        double max1=-99999, max2=-99999;        for(int i=0; i<m; i++)        {            cin>>arr[i].name>>arr[i].sex>>arr[i].rnd1>>arr[i].rnd2;            if(arr[i].rnd1 > max1)                max1 = arr[i].rnd1;            if(arr[i].rnd2 > max2)                max2 = arr[i].rnd2;        }        double ans1=300.0/max1, ans2=300.0/max2;        for(int i=0; i<m; i++)            arr[i].ave = 0.3*arr[i].rnd1*ans1 + 0.7*arr[i].rnd2*ans2;        sort(arr, arr+m, cmp);        bool ok = false, flag = false;        for(int i=0; i<m; i++)        {            if(arr[i].sex[0] == 'f')            {                ok = true;                if(i < n)                    flag = true;            }        }        puts("The member list of Shandong team is as follows:");        if(!ok || flag)            for(int i=0; i<n; i++)                cout<<arr[i].name<<endl;        else if(!flag)        {            for(int i=0; i<n-1; i++)                cout<<arr[i].name<<endl;            for(int i=n; i<m; i++)                if(arr[i].sex[0] == 'f')                {                    cout<<arr[i].name<<endl;                    break;                }        }    }    return 0;}

排名在 n 以后,就要选 n-1名,
其实就是模拟一下就行了。。。
上代码:


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 刚开的淘宝店没有生意怎么办 房产代理公司不给渠道结佣金怎么办 天猫超过72小时不发货怎么办 流量魔盒苹果下载怎么打不开怎么办 淘宝包邮店铺新疆地区拍怎么办 淘宝客服当顾客要优惠时怎么办 微信手机号注册的找不到了怎么办 之前注册的微信找不到了怎么办 苹果ipad的id密码忘了怎么办 淘宝和支付宝用一张银行卡怎么办 淘宝卖家填写虚假物流信息怎么办 淘宝店铺的浏览量越来越少怎么办 网上充手机话费充错了怎么办 夜神模拟器上陌陌的位置不对怎么办 如果在大庭广众之下放了个屁怎么办 淘宝分销上传宝贝被系统下架怎么办 酷狗喜欢歌单里面的歌都没了怎么办 苹果手机下载不了微信缓冲怎么办 登陆微信提示版本过低登不了怎么办 苹果手机微信版本过低登不上怎么办 微信小程序显示微信版本过低怎么办 三星手机登微信显示版本过低怎么办 微信版本低无法登录无法升级怎么办 手机淘宝五应用界面无法打开怎么办 入住淘宝主播没有微博粉丝怎么办 手机淘宝领金币怎么没有了怎么办 淘宝荬家缺货对付款买家怎么办 淘宝买家确认收货后申请退款怎么办 淘宝东西失效了但付过款了怎么办 淘宝图片被投诉盗图怎么办原图没了 淘宝退款申请不小心撤销了怎么办 淘宝不小心点了撤销退款怎么办 淘宝上退款不小心撤销了怎么办 新店淘宝卖家想开通直播怎么办 想开通淘宝直播却没有粉丝怎么办 淘宝店家拒绝给我改地址怎么办0 淘宝被投诉卖假申诉失败怎么办 要退保证金但是有人买东西了怎么办 手机淘宝上我是商家停止服务怎么办 淘宝上买的电脑商家关闭了怎么办 淘宝链接复制链链接发不出去怎么办