pta 静静的推荐(C语言实现)

  • Post author:
  • Post category:其他




题目描述

天梯赛结束后,某企业的人力资源部希望组委会能推荐一批优秀的学生,这个整理推荐名单的任务就由静静姐负责。企业接受推荐的流程是这样的:

只考虑得分不低于 175 分的学生;
一共接受 K 批次的推荐名单;
同一批推荐名单上的学生的成绩原则上应严格递增;
如果有的学生天梯赛成绩虽然与前一个人相同,但其参加过 PAT 考试,且成绩达到了该企业的面试分数线,则也可以接受。

给定全体参赛学生的成绩和他们的 PAT 考试成绩,请你帮静静姐算一算,她最多能向企业推荐多少学生?

输入格式:

输入第一行给出 3 个正整数:N(≤105)为参赛学生人数,K(≤5×103)为企业接受的推荐批次,S(≤100)为该企业的 PAT 面试分数线。

随后 N 行,每行给出两个分数,依次为一位学生的天梯赛分数(最高分 290)和 PAT 分数(最高分 100)。

输出格式:

在一行中输出静静姐最多能向企业推荐的学生人数。



解题思路

有两个测试点运行超时,还没有想出来……

参考他人的代码,思想很容易理解,非常巧妙,具体详细代码可见


L1-8 静静的推荐 (20),C语言,超级简单的代码哦,你不是不会,只是没细想而已



代码

//正确的代码
#include <stdio.h>
int main(){
    int arr[291] = {0}, brr[291] = {0};
    int n, k, s, cnt = 0, i, score, pscore;
    
    scanf("%d%d%d", &n, &k, &s);
    while (n--){
        scanf("%d%d", &score, &pscore);
        if (score >= 175){
            arr[score]++;
        }
        if (pscore >= s){
            brr[score]++;
        }
    }
    while (k--){
        for (i=175; i<291; i++){
            if (arr[i] > 0){
                cnt++;
                arr[i]--;
                while (arr[i]>0 && brr[i]>0){
                    cnt++;
                    arr[i]--;
                    brr[i]--;
                }
            }
        }
    }
    
    printf("%d", cnt);
    
    return 0;
}
//错误代码
#include <stdio.h>

struct stu
{
    int grade; // 天梯赛分数
    int pat;   // PAT分数
    int flag;  // 是否被推荐
};

int main()
{
    // input
    int n, k, s;
    scanf("%d%d%d", &n, &k, &s);
    struct stu st[n];
    for (int i=0; i<n; i++)
        scanf("%d%d", &st[i].grade, &st[i].pat);

    // process
    int cnt = 0; // 初始化要推荐的学生人数为0
    for (int i=0; i<n; i++)
        st[i].flag = 0; // 初始化学生全部未推荐
    
    // 参赛学生按照天梯赛成绩排序
    struct stu tmp;
    for (int i=0; i<n-1; i++){
        for (int j=i+1; j<n; j++){
            if (st[i].grade > st[j].grade){
                tmp = st[i];
                st[i] = st[j];
                st[j] = tmp;
            }
        }
    }

    for (int i=0; i<k; i++){
        int min = 0;
        for (int j=0; j<n; j++){
            if ((st[j].grade >= 175 && st[j].flag == 0
                && st[j].grade > min)
                || (st[j].grade == min && st[j].flag == 0
                && st[j].pat >= s)){
                cnt++; // 推荐人数加1
                st[j].flag = 1; // 修改标记位
                min = st[j].grade;
//                 printf("tuijian %d\n", st[j].grade);
            }
        }
    }

    // output
    printf("%d\n", cnt);

    return 0;
}

依旧是两个测试点显示运行超时,呜呜呜……

#include <stdio.h>

void swap(int * a, int * b){
    int tmp;
    
    tmp = *a;
    *a = *b;
    *b = tmp;
}

int main(){
    int n, k, s, i, j;
    int score = 0, cnt = 0;
    
    scanf("%d%d%d", &n, &k, &s);
    
    int arr[n][2];
    for (i=0; i<n; i++){
        scanf("%d %d", &arr[i][0], &arr[i][1]);
    }
    
    int brr[n];
    for (i=0; i<n; i++){
        brr[i] = 0;
    }
    for (i=0; i<n; i++){
        if (arr[i][0]>=175 && arr[i][1]>=s){
            brr[i] = 1;
        }
    }
    for (i=0; i<n-1; i++){
        if (brr[i] == 1){
            continue;
        }
        for (j=i+1; j<n; j++){
            if (brr[j] == 1){
                continue;
            }
            if (arr[i][0] > arr[j][0]){
                swap(&arr[i][0], &arr[j][0]);
                swap(&arr[i][1], &arr[j][1]);
            }
            if (arr[i][0] == arr[j][0]){
                if (arr[i][1] > arr[j][1]){
                    swap(&arr[i][1], &arr[j][1]);
                }
            }
        }
    }
    
    /*for (i=0; i<n; i++){
        printf("%d %d\n", arr[i][0], arr[i][1]);
    }
    printf("Next\n");*/
    
    for (i=0; i<k; i++){
        score = 0;
        for (j=0; j<n; j++){
            if (brr[j] == 1){
                continue;
            }
            if (arr[j][0] < 175){
                continue;
            }
            if (arr[j][0] > score){
                score = arr[j][0];
                brr[j] = 1;
//                printf("%d %d\n", arr[j][0], arr[j][1]);
                continue;
            }
            if (arr[j][0]==score && arr[j][1]>=s){
                brr[j] = 1;
//                printf("%d %d\n", arr[j][0], arr[j][1]);
            }
        }
    }
    for (i=0; i<n; i++){
        if (brr[i] == 1){
            cnt++;
        }
    }
    
    printf("%d", cnt);
    
    
    return 0;
}



版权声明:本文为dream_aleaf原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。