PTA 获奖10分

在某次竞赛中,判题规则是按解题数从多到少排序,在解题数相同的情况下,按总成绩(保证各不相同)从高到低排序,取排名前60%的参赛队(四舍五入取整)获奖,请确定某个队能否获奖。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试的第一行输入1个整数n(1≤n≤15)和1个字符串ms(长度小于10且不含空格),分别表示参赛队伍总数和想确定是否能获奖的某个队名;接下来的n行输入n个队的解题信息,每行一个1个字符串s(长度小于10且不含空格)和2个整数m,g(0≤m≤10,0≤g≤100),分别表示一个队的队名、解题数、成绩。当然,n个队名中肯定包含ms。

输出格式:

对于每组测试,若某队能获奖,则输出“YES”,否则输出“NO”。引号不必输出。

输入样例:

1
3 team001
team001 2 27
team002 2 28
team003 0 7

输出样例:

YES

来源:

[1] 黄龙军, 等. 大学生程序设计竞赛入门—C/C++程序设计(微课视频版), 北京:清华大学出版社, 2020.11. ISBN:9787302564744
[2] 黄龙军.程序设计竞赛入门(Python版),北京:清华大学出版社,2021.4. ISBN:9787302571230

我的想法是用快排来做,这题不难

#include <stdio.h>
#include <string.h>
typedef struct paimin
{
    char name[11];
    int jt, fs;
} pm;
int cmp(void const *a, void const *b)//这是快排cmp函数的固定格式不能更改,所以函数内引用结构体的时候需要强转
{
    if (((pm *)a)->jt - ((pm *)b)->jt)
        return ((pm *)a)->jt < ((pm *)b)->jt ? 1 : -1;
    else
        return ((pm *)a)->fs < ((pm *)b)->fs ? 1 : -1;
}
int main()
{
    char ms[11];
    int N, n, i;
    scanf("%d", &N);
    while (N--)
    {
        scanf("%d%s\n", &n, ms);//这里用\n接收掉第一行的回车避免后面输入脏数据
        pm s[15];
        for (i = 0; i < n; i++)
            scanf("%s%d%d", s[i].name, &s[i].jt, &s[i].fs);
        qsort(s, n, sizeof(pm), cmp);//快排的调用
        n = (n * 0.6)-(int)(n * 0.6)>0.5?(int)(n * 0.6)+1:(int)(n * 0.6);//四舍五入的大概原理就是判断这个实数的小数部分是否>0.5是则强转int并+1不是则强转int输出
        for (i = 0; i < n; i++)//通过上面n*0.6获得n个数排序以后前60%个数,并从中遍历如果发现与ms相同的队名则证明ms可以获奖
            if (!strcmp(s[i].name, ms))
                break;
        if (i < n)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值