PTA L1-8 静静的推荐

news2024/7/11 18:11:45

PTA L1-8 静静的推荐

分数 20

全屏浏览题目

切换布局

作者 陈越

单位 浙江大学

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

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

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

输入格式:

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

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

输出格式:

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

输入样例:

10 2 90
203 0
169 91
175 88
175 0
175 90
189 0
189 0
189 95
189 89
256 100

输出样例:

8

样例解释:

第一批可以选择 175、189、203、256 这四个分数的学生各一名,此外 175 分 PAT 分数达到 90 分的学生和 189 分 PAT 分数达到 95 分的学生可以额外进入名单。第二批就只剩下 175、189 两个分数的学生各一名可以进入名单了。最终一共 8 人进入推荐名单。

代码长度限制

16 KB

Java (javac)

时间限制

1300 ms

内存限制

256 MB

Python (python3)

时间限制

400 ms

内存限制

64 MB

其他编译器

时间限制

200 ms

内存限制

64 MB

我的答案:

一、信息

1.天梯赛结束后,企业的人力资源部希望能推荐一些学生。

2.只考虑得分不低于175分的学生

3.一共接收K批次的推荐名单

4.同一批推荐名单上的学生成绩原则应该严格递增

5.如果优点学生天梯赛成绩与前一个人相同,但通过了PTA考试,且成绩达到了企业的面试分数线,则也可以接受。

6.给出全体参赛学生的成绩和它们的PAT考试成绩,请你的PAT考试成绩,请你算一算他能向企业推荐多少学生。

7.输入格式

三个输入,一个是参赛学生人数,二是企业接受推荐批次,S为该企业的PAT面试分数线

8.输出格式

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

二、分析

条件1.告诉我们的此次题目的目的

条件2.其实就是第一个限制条件也是规则说明了只考虑175分及以上的人

条件3.就是告诉我们第二个限制条件,表面上很简单但其实告诉我们一种特殊情况,我们不妨来看看有几种情况:

1.第一种情况 就是每一个人的分数都不一样即没有同分,这种情况很简单因为其实动用第一个限制条件就行了,难道你们不觉得很奇怪吗这种情况因为如果这样就不需要条件3的限制条件了。

2.第二种情况 就是存在有同分的情况

其实这个问题就是他每一批都会先遍历第一列的元素然后再遍历第二列元素相当于:

这里以第一批为例我们第一次会收到175、189、203、256 四个学生不同分然后他开始遍历第二列又查到PTA过90分的两个同学175 和189

从这个样例分析中我就知道了,其实每一批次是通过先检测第一列然后检测第二列在放入这个批次

 三、步骤

第一步 定义一个数据结果用来存结果,问题出现就是首先用什么数据结构来模拟这个批次的队列就是怎么存结果

第二步 k就是批次其实就是循环的次数所以我们可以通过循环k次然后遍历

第三步 进入第k次遍历,然后判断第一列是否天梯赛的分数是否符合175分及以上,满足的话就压入数据结构中,然后判断第二列是否符合限制条件2.满足就压入数据结构中。

第四步 结果输出数据结构的数就行了。

四、出现的问题

问题1.存储结构的数据结构应该选择什么

我一个大神同学推荐我使用map数据结构。

问题2.


正确答案:

一、信息

题目描述:根据一定的规则筛选学生,为企业推荐K批学生。筛选规则为:

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

二、分析

  1. 先对满足天梯赛分数>=175并且PAT分数>=S的学生进行计数,并标记这些学生不再参与后续计算。
  2. 对于满足天梯赛分数>=175的学生,使用map记录每一个分数的出现次数,只要这个分数的出现次数不超过K就可以计入结果。

三、算法设计

数组思路:

  1. 初始化一个数组counts用于跟踪每个天梯赛分数的推荐次数。
  2. 遍历每个学生,检查其是否满足上述的推荐条件。
  3. 如果满足条件,增加总推荐数,并更新对应天梯赛分数的推荐次数。

map思路:

  1. 遍历所有学生的分数。
  2. 对于天梯赛分数>=175并且PAT分数>=S的学生,增加答案计数,并标记这些学生不再参与后续计算。
  3. 对于天梯赛分数>=175的学生,检查该分数在map中的出现次数,如果不超过K则增加答案计数。

四、代码实现

数组实现:

C语言:
#include <stdio.h>

int main() {
    int n, k, s, total = 0;
    int ladderScores[100500] = {0}, patScores[100500] = {0};
    int counts[291] = {0}; // 天梯赛最高分290

    // 输入
    scanf("%d %d %d", &n, &k, &s);
    for (int i = 0; i < n; i++) {
        scanf("%d %d", &ladderScores[i], &patScores[i]);
    }

    // 处理
    for (int i = 0; i < n; i++) {
        if (ladderScores[i] >= 175) {
            // 如果PAT分数达标
            if (patScores[i] >= s) {
                total++;
                continue;
            }
            // 检查这个天梯赛分数是否已经推荐k次
            if (counts[ladderScores[i]] < k) {
                total++;
                counts[ladderScores[i]]++;
            }
        }
    }

    // 输出结果
    printf("%d\n", total);
    return 0;
}

Map实现:

C语言:
#include <stdio.h>

// 简单的map数据结构
typedef struct {
    int keys[100500];
    int values[100500];
    int size;
} SimpleMap;

// 初始化map
void initMap(SimpleMap *m) {
    m->size = 0;
}

// 向map中插入或更新一个键值对
void put(SimpleMap *m, int key, int value) {
    for (int i = 0; i < m->size; i++) {
        if (m->keys[i] == key) {
            m->values[i] = value;
            return;
        }
    }
    m->keys[m->size] = key;
    m->values[m->size] = value;
    m->size++;
}

// 从map中获取一个键对应的值,如果键不存在返回defaultValue
int get(SimpleMap *m, int key, int defaultValue) {
    for (int i = 0; i < m->size; i++) {
        if (m->keys[i] == key) {
            return m->values[i];
        }
    }
    return defaultValue;
}

int main() {
    int n, k, s, total = 0;
    int ladderScore, patScore;
    SimpleMap scoreCounts;
    initMap(&scoreCounts);

    // 输入
    scanf("%d %d %d", &n, &k, &s);
    for (int i = 0; i < n; i++) {
        scanf("%d %d", &ladderScore, &patScore);

        if (ladderScore >= 175) {
            // 如果PAT分数达标
            if (patScore >= s) {
                total++;
                continue;
            }
            // 检查这个天梯赛分数是否已经推荐k次
            int count = get(&scoreCounts, ladderScore, 0);
            if (count < k) {
                total++;
                put(&scoreCounts, ladderScore, count + 1);
            }
        }
    }

    // 输出结果
    printf("%d\n", total);
    return 0;
}
C++:
#include <iostream>
#include <unordered_map>
using namespace std;

int main() {
    int n, k, s, total = 0;
    int ladderScore, patScore;
    unordered_map<int, int> scoreCounts; // 使用C++ STL中的unordered_map作为map

    // 输入
    cin >> n >> k >> s;
    for (int i = 0; i < n; i++) {
        cin >> ladderScore >> patScore;

        if (ladderScore >= 175) {
            // 如果PAT分数达标
            if (patScore >= s) {
                total++;
                continue;
            }
            // 检查这个天梯赛分数是否已经推荐k次
            if (scoreCounts[ladderScore] < k) {
                total++;
                scoreCounts[ladderScore]++;
            }
        }
    }

    // 输出结果
    cout << total << endl;
    return 0;
}

这里就显示了一个问题C++STL库是真好用啊

注意事项:

  1. 使用C++的标准库中的unordered_map来替代手动实现的SimpleMapunordered_map是C++ STL中的一个高效的键值对容器。
  2. 使用C++的流输入输出来替代C的scanfprintf
  3. 不再需要手动实现initMapputget函数,因为unordered_map已经提供了相应的功能。

Java实现:

import java.util.HashMap;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int k = sc.nextInt();
        int s = sc.nextInt();
        int total = 0;

        HashMap<Integer, Integer> scoreCounts = new HashMap<>();

        for (int i = 0; i < n; i++) {
            int ladderScore = sc.nextInt();
            int patScore = sc.nextInt();

            if (ladderScore >= 175) {
                // 如果PAT分数达标
                if (patScore >= s) {
                    total++;
                    continue;
                }
                // 检查这个天梯赛分数是否已经推荐k次
                scoreCounts.putIfAbsent(ladderScore, 0);
                if (scoreCounts.get(ladderScore) < k) {
                    total++;
                    scoreCounts.put(ladderScore, scoreCounts.get(ladderScore) + 1);
                }
            }
        }

        System.out.println(total);
    }
}

五、实现代码过程中可能遇到的问题

数组:

  1. counts数组的大小应确保可以存放所有可能的天梯赛分数。
  2. 在检查每个学生的天梯赛分数是否被推荐超过K次时,需要确保先检查是否已经达到限制,然后再增加计数。
  3. 在处理满足条件的学生时,要确保不会重复计数。在给出的代码中,使用continue确保满足PAT成绩条件的学生不会被重复计算。
  4. 初始化counts数组时要确保其值全为0,以防止出现未定义的行为。

map:

  1. 使用了map数据结构,需要确保包含相关的库。
  2. 在遍历学生分数时,要确保已经被计入答案的学生不再被计算。

六、大师对我分析的评价

我的分析对题目的细节有深入的探讨,特别是我如何从题目中抽取关键信息并将它们逻辑化。以下是对我的分析的评价:

优点

  1. 详尽性:我非常详细地解析了题目提供的信息,确保没有遗漏关键点。
  2. 结构化:我的分析是结构化的,先后从“信息”到“分析”,再到“步骤”和“问题”,使读者很容易跟随我的思路。
  3. 场景考虑:我明确指出了两种主要场景——是否存在同分的情况。这是非常关键的,因为处理这两种场景是实现解决方案的核心。
  4. 清晰的步骤:我给出的处理步骤清晰且逻辑性强。

需要改进的地方

  1. 循环的理解:我提到需要循环k次来处理学生,但实际上只需要一次遍历即可,使用数据结构来跟踪每个分数的出现次数。
  2. 数据结构的应用:虽然我提到使用map,但实际上应该更明确描述如何使用map来跟踪每个分数的出现次数和推荐次数。
  3. 边界情况考虑:在分析时,可以考虑一些极端或边界情况,如所有学生的天梯赛分数都低于175或所有学生的PAT分数都低于S。

总体而言,我的分析是非常全面和透彻的,只需要在某些地方进行细微调整和完善。如果我继续按照这种方式对问题进行分析,无疑将在解决复杂问题时获得很好的效果。

七、从这到题目中我们能学到什么

我学到的

  1. 问题分析:如何从题目描述中抽取关键信息并根据这些信息构建解决方案。
  2. 数据结构的应用:了解到在某些问题中,如何有效地使用数据结构(如map)来简化和优化解题过程。
  3. 编程实践:通过实际编码,我不仅加深了对问题的理解,而且增强了编程能力。
  4. 测试和调试:在编写代码后,我可能遇到了需要调试的问题,从中我学习了如何识别、定位并解决这些问题。

需要提高的方面

  1. 深入理解数据结构:虽然我提到了使用map,但如何具体地和有效地应用它仍有待加深。
  2. 考虑边界情况:在解题时,考虑所有可能的边界和极端情况是很重要的,以确保解决方案的完整性和正确性。
  3. 优化算法:虽然我的初步方法可以解决问题,但总是有空间寻找更高效或更简洁的解决方案。
  4. 代码风格与组织:确保代码结构清晰、易于阅读和维护是编程的一个重要方面。随着我遇到更复杂的问题,代码的组织和风格将变得越来越重要。

这样的分析和反思对于提高问题解决技能和编程能力都是非常有价值的。继续分析和思考我遇到的每一个问题,无疑将加速我的学习和成长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1145169.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软考系列(系统架构师)- 2012年系统架构师软考案例分析考点

试题一 软件架构&#xff08;架构风格对比、架构风格选取、架构设计过程&#xff09; 【问题1】&#xff08;12分&#xff09; 请用200字以内的文字解释什么是软件架构风格&#xff0c;并从集成开发环境与用户的交互方式、集成开发环境的扩展性、集成开发环境的数据管理三个方…

Anaconda下载和安装

1.概述 1&#xff09;包含conda&#xff1a;conda是一个环境管理器&#xff0c;其功能依靠conda包来实现&#xff0c;该环境管理器与pip类似。 2&#xff09;安装大量工具包&#xff1a;Anaconda会自动安装一个基本的python&#xff0c;该python的版本Anaconda的版本有关。该…

进程(详解)

进程 进程PCB进程的定义进程的组成进程模式进程的状态进程的运行进程的创建进程的结束孤儿进程僵尸进程僵尸进程的危害 进程的创建pidforkwait案例 进程 PCB 从操作系统理解进程概念-------先描述&#xff0c;后组织 为了使参与并发执行的程序能独立的运行&#xff0c;必须为之…

经常遇到的问题

一个前端经常会遇到的问题 例如&#xff0c;我想要在一个项目里&#xff0c;监听所有的fetch请求&#xff0c;应该怎么办&#xff1f;又或者说&#xff0c;我想用别人封装好的方法&#xff0c;但是在它之前&#xff0c;需要经过一层处理、判断&#xff0c;然后再看情况是否调用…

如何隐藏woocommerce 后台header,woocommerce-layout__header

如何隐藏woocommerce 后台header&#xff0c;woocommerce-layout__header WooCommerce |Products Store Activity| Inbox| Orders| Stock| Reviews| Notices| breadcrumbs 在 functions.php 里添加如下代码即可&#xff1a; // Disable WooCommerce Header in WordPress Admi…

开启CETOS 裸奔了一年的服务器开启firewall防火墙

记录一下关于firewall&#xff0c;博主非运维专家或服务器专家。 背景 客户有一台裸奔运行了一年多的系统有公网但发现没有开防火墙&#xff0c;iptables和firewall均是关闭状态&#xff0c;通过扫描发现很多漏洞。根据客户要求对端口进行重新梳理且关闭不必要或有潜在风险的…

kubeadmin部署k8s1.27.4

kubeadmin部署k8s1.27.4 环境介绍 IP主机名资源配置系统版本192.168.117.170k8s-master2c2g200gCentos7.9192.168.117.171k8s-node12c2g200gCentos7.9192.168.117.172k8s-node22c2g200gCentos7.9 编辑本地解析且修改主机名 三台主机都要做 vim /etc/hosts配置主机名 mast…

软考系列(系统架构师)- 2013年系统架构师软考案例分析考点

试题一 软件架构&#xff08;根据描述填表、ESB 定义和功能&#xff09; 【问题1】&#xff08;10分&#xff09; 服务建模是对Ramp Coordination信息系统进行集成的首要工作&#xff0c;公司的架构师首先对Ramp Coordination信息系统进行服务建模&#xff0c;识别出系统中的两…

lesson2(补充)关于>>运算符和<<运算符重载

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; cout和cin我们在使用时需要包含iostream头文件&#xff0c;我们可以知道的是cout是写在ostream类里的&#xff0c;cin是写在istream类里的&#xff0c;他们都是定义出的对象&#xff0c;而<< 和 >…

猴子吃桃问题--C语言

问题描述&#xff1a; 猴子第1天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不过瘾&#xff0c;又多吃了一个。第2天早 上又将剩下的桃子吃掉一半&#xff0c;又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天 早上想再吃时&#xff0c;就只剩一…

【AD9361 数字接口CMOS LVDSSPI】B 并行数据之CMOS 续

续【AD9361 数字接口CMOS &LVDS&SPI】B 并行数据之CMOS 数据总线空闲和周转周期 &#xff08;CMOS&#xff09; P0_D[11&#xff1a;0]和P1_D[11&#xff1a;0]总线信号通常由BBP或AD9361有源驱动。在任何空闲期间&#xff0c;两个组件都会忽略数据总线值。但是&…

抢占式调度是如何发生的

最常见的现象就是一个进程执行时间太长了&#xff0c;是时候切换到另一个进程了。那怎么衡量一个进程的运行时间呢&#xff1f;在计算机里面有一个时钟&#xff0c;会过一段时间触发一次时钟中断&#xff0c;通知操作系统&#xff0c;时间又过去一个时钟周期&#xff0c;这是个…

039-第三代软件开发-PDF阅读器

第三代软件开发-PDF阅读器 文章目录 第三代软件开发-PDF阅读器项目介绍PDF阅读器1 初始化PDF view2 qml 中使用3 创建模块 关键字&#xff1a; Qt、 Qml、 pdf、 LTDev、 本地 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Met…

NNDL:作业五

习题4-1 对于一个神经元,并使用梯度下降优化参数w时,如果输入x恒大于0,其收敛速度会比零均值化的输入更慢. 证明&#xff1a; 激活函数以sigmoid为例。 神经元&#xff1a;有两层&#xff0c;线性层和激活层&#xff1a;yw*xb,然后y‘sigmoid(y)&#xff0c;也就是。 梯度…

[C++]——带你学习类和对象

类和对象——上 目录&#xff1a;一、面向过程和面向对象二、类的概念三、类的访问限定符和封装3.1 访问限定符3.2 封装 四、类的作用域五、类的实例化六、类的对象大小的计算七、类成员函数this指针7.1 this指针的引用7.2 this 指针的特性 目录&#xff1a; 类和对象是很重要…

Vue3问题:如何实现密码加密登录?前后端!

前端功能问题系列文章&#xff0c;点击上方合集↑ 序言 大家好&#xff0c;我是大澈&#xff01; 本文约3400字&#xff0c;整篇阅读大约需要6分钟。 本文主要内容分三部分&#xff0c;第一部分是需求分析&#xff0c;第二部分是实现步骤&#xff0c;第三部分是问题详解。 …

Python--练习:报数字(数7)

案例&#xff1a; 一些同学从1开始报数&#xff0c;当需要报出的数字尾数是7或者该数字是7的倍数时&#xff0c;则该同学跳过这个数字&#xff0c;不进行报数。所有同学都参与游戏后&#xff0c;游戏结束。如输入学生数量为50&#xff0c;游戏结束后&#xff0c;报数的同学数量…

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割6(数据预处理)

由于之前哔站作者整理的LUNA16数据处理方式过于的繁琐&#xff0c;于是&#xff0c;本文就对LUNA16数据做一个新的整理&#xff0c;最终得到的数据和形式是差不多的。但是&#xff0c;主要不同的是代码逻辑比较的简单&#xff0c;便于理解。 对于数据集的学习&#xff0c;可以…

pg 数据库,在新增的数据的时候,根据字段唯一性去更新数据

目录 1 问题2 实现 1 问题 在使用pg 数据库的时候&#xff0c;我们新增数据&#xff0c;希望如果有几个字段和数据库的一样&#xff0c;那么就更新数据&#xff0c;也就是在新增的时候&#xff0c;自动判断是否数据库有这个数据&#xff0c;有就更新&#xff0c;没有就新增 2…

StripedFly恶意软件框架感染了100万台Windows和Linux主机

导语 近日&#xff0c;一款名为StripedFly的恶意软件框架在网络安全研究人员的监视之外悄然感染了超过100万台Windows和Linux系统。这款跨平台的恶意软件平台在过去的五年中一直未被察觉。在去年&#xff0c;卡巴斯基实验室发现了这个恶意框架的真实本质&#xff0c;并发现其活…