image

编辑人: 桃花下浅酌

calendar2025-12-08

message6

visits362

全国信息学奥林匹克联赛(NOIP2019)复赛 普及组参考答案

一、实操题

1、数字游戏

【问题描述】

小K同学向小P同学发送了一个长度为8的 01字符串来玩数字游戏,小P  同学想 要知道字符串中究竟有多少个1。

注意:01字符串为每一个字符是0或者1的字符串,如“101”(不含双引号)为一 个长度为3的01字符串。

【输入格式】

输入文件名为number in。

输入文件只有一行, 一个长度为8的01字符串s。


【输出格式】

输出文件名为number.out。

输出文件只有一行,包含一个整数,即01字符串中字符1 的个数。

【输入输出样例1】

【输入输出样例1说明】

该01字符串中有2个字符1。


【输入输出样例2】

【输入输出样例2说明】

该01字符串中有8个字符1。

【数据规模与约定】

对于20%的数据,保证输入的字符全部为0。

对于100%的数据,输入只可能包含字符0和字符1,字符串长度固定为8。

参考答案:对于输入的01字符串,我们需要统计其中字符1的个数。可以直接遍历字符串,对每个字符进行判断,如果是字符1,则计数器加1。最后输出计数器的值即可。


2、公交换乘

【问题描述】

著名旅游城市B市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交 车的优惠方案:

1.在搭乘一次地铁后可以获得一张优惠票,有效期为45分钟,在有效期内可以 消耗这张优惠票,免费搭乘一次票价不超过地铁票价的公交车。在有效期内指 开始乘公交车的时间与开始乘地铁的时间之差小于等于45分钟,即:tbus-tsubway≤45

2.  搭乘地铁获得的优惠票可以累积,即可以连续搭乘若干次地铁后再连续使用优 惠票搭乘公交车。

3.  搭乘公交车时,如果可以使用优惠票一定会使用优惠票;如果有多张优惠票满 足条件,则优先消耗获得最早的优惠票。

现在你得到了小轩最近的公共交通出行记录,你能帮他算算他的花费吗?

【输入格式】

输入文件名为transfer . in。

输入文件的第一行包含一个正整数n,代表乘车记录的数量。

接下来的n行,每行包含3个整数,相邻两数之间以一个空格分隔。第i行的 第1个整数代表第i条记录乘坐的交通工具,0代表地铁,1代表公交车;第2个 整数代表第i条记录乘车的票价pricei;第三个整数代表第i条记录开始乘车的时 间ti (距0时刻的分钟数)。

我们保证出行记录是按照开始乘车的时间顺序给出的,且不会有两次乘车记录出现 在同一分钟。

【输出格式】

输出文件名为transfer . out。

输出文件有一行,包含一个正整数,代表小轩出行的总花费

【 输入输出样例 1】

【输入输出样例1说明】

第一条记录,在第3分钟花费10元乘坐地铁。

第二条记录,在第46分钟乘坐公交车,可以使用第一条记录中乘坐地铁获得的优 惠票,因此没有花费。

第三条记录,在第50分种花费12元乘坐地铁。

第四条记录,在第96分钟乘坐公交车,由于距离第三条记录中乘坐地铁已超过45 分钟,所以优惠票已失效,花费3元乘坐公交车。

第五条记录,在第110分钟花费5元乘坐地铁。

第六条记录,在第135分钟乘坐公交车,由于此时手中只有第五条记录中乘坐地铁 获得的优惠票有效,而本次公交车的票价为6元,高于第五条记录中地铁的票价5元, 所以不能使用优惠票,花费6元乘坐公交车。

总共花费36元。

【输入输出样例2】

【输入输出样例2说明】

第一条记录,在第1分钟花费5元乘坐地铁。

第二条记录,在第16分钟花费20元乘坐地铁。

第三条记录,在第23分钟花费7元乘坐地铁。

第四条记录,在第31分钟乘坐公交车,此时只有第二条记录中乘坐的地铁票价高 于本次公交车票价,所以使用第二条记录中乘坐地铁获得的优惠票。

第五条记录,在第38分钟乘坐公交车,此时第一条和第三条记录中乘坐地铁获得  的优惠票都可以使用,使用获得最早的优惠票,即第一条记录中乘坐地铁获得的优惠票。

第六条记录,在第68分钟乘坐公交车,使用第三条记录中乘坐地铁获得的优惠票。 总共花费32元。

【数据规模与约定】

参考答案:根据给定的输入,我们需要模拟小轩的公共交通出行记录,并计算他的总花费。首先,我们需要维护一个时间戳和一个优惠票列表。时间戳记录当前时间,优惠票列表存储每张优惠票的信息,包括获得时间、地铁票价和有效时间。对于每条记录,我们按照以下步骤处理:1. 如果记录是地铁,则更新时间戳,并将优惠票加入优惠票列表。2. 如果记录是公交车,则遍历优惠票列表,找到最早获得且满足有效时间的优惠票,如果找到,则使用优惠票免费搭乘公交车,并从优惠票列表中移除该优惠票;否则,需要支付公交车票价。3. 更新时间戳。最后,计算总花费并输出。


3、纪念品

【问题描述】

小伟突然获得一种超能力,他知道未来T天N种纪念品每天的价格。某个纪念品  的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量。

每天,小伟可以进行以下两种交易无限次:

1. 任选一个纪念品,若手上有足够金币,以当日价格购买该纪念品;

2. 卖出持有的任意一个纪念品,以当日价格换回金币。

每天卖出纪念品换回的金币可以立即用于购买纪念品,当日购买的纪念品也可以当 日卖出换回金币。当然, 一直持有纪念品也是可以的。

T天之后,小伟的超能力消失。因此他一定会在第T天卖出所有纪念品换回金币。 小伟现在有M枚金币,他想要在超能力消失后拥有尽可能多的金币。

【输入格式】

输入文件名为souvenir . in。

第一行包含三个正整数T,N,M,相邻两数之间以一个空格分开,分别代表未来天数 T,纪念品数量N,小伟现在拥有的金币数量M。

接下来T行,每行包含N个正整数,相邻两数之间以一个空格分隔。第i行的N个正整数分别为Pi1,Pi2, …… ,Pin,其中Pi,j表示第i天第j种纪念品的价格。

【输出格式】

输出文件名为souvenir . out。

输出仅一行,包含一个正整数,表示小伟在超能力消失后最多能拥有的金币数量。

【输入输出样例1】

【 输入输出样例1说明】

最佳策略是:

第二天花光所有100枚金币买入5个纪念品1;

第三天卖出5个纪念品1,获得金币125枚;

第四天买入6个纪念品1,剩余5枚金币;

第六天必须卖出所有纪念品换回300枚金币,第四天剩余5枚金币,共305枚金币。

超能力消失后,小伟最多拥有305枚金币。

【输入输出样例2】

【输入输出样例2说明】

最佳策略是:

第一天花光所有金币买入10个纪念品1;

第二天卖出全部纪念品1得到150枚金币并买入8个纪念品2和1个纪念品3,剩 余1枚金币;

第三天必须卖出所有纪念品换回216枚金币,第二天剩余1枚金币,共217枚金币。 超能力消失后,小伟最多拥有217枚金币。

【数据规模与约定】

对于10%的数据,T=1。

对于30%的数据,T≤4,N≤4,M≤100,所有价格10≤Pij≤100。 

另有15%的数据,T≤100,N=1。

另有15%的数据,T=2,N≤100。

对于100%的数据,T≤100,N≤100,M≤,所有价格1≤Pij≤10⁴,数 据保证任意时刻,小明手上的金币数不可能超过10⁴。

参考答案:对于本题,我们可以使用动态规划来解决。首先,我们定义一个二维数组dp[i][j],其中dp[i][j]表示在第i天结束时,拥有j枚金币可以获得的最大金币数。然后,我们可以根据以下状态转移方程来更新dp数组:1. 如果在第i天结束时,小伟选择购买纪念品,则他可以选择在第i-1天结束时拥有j-P[i][k]枚金币,其中P[i][k]表示第i天第k种纪念品的价格。因此,dp[i][j] = max(dp[i][j], dp[i-1][j-P[i][k]] + P[i][k])。2. 如果在第i天结束时,小伟选择卖出纪念品,则他可以选择在第i-1天结束时拥有j+P[i][k]枚金币,其中P[i][k]表示第i天第k种纪念品的价格。因此,dp[i][j] = max(dp[i][j], dp[i-1][j+P[i][k]])。最后,我们只需要在最后一天结束时,遍历所有可能的金币数,找到最大的dp[T][j]即可。


4、加工零件

【问题描述】

凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很 神奇。工厂里有n位工人,工人们从1~n编号。某些工人之间存在双向的零件传送 带。保证每两名工人之间最多只存在一条传送带。

如果x号工人想生产一个被加工到第L(L>1)阶段的零件,则所有 与 x 号 工 人 有传送带直接相连的工人,都需要生产一个被加工到第L- 1阶段的零件(但x号工 人自己无需生产第L - 1阶段的零件)。

如果x号工人想生产一个被加工到第1阶段的零件,则所有与x号工人有传送带直接 相连的工人,都需要为x号工人提供一个原材料。

轩 轩 是 1 号工人。现在给出q张工单,第i张工单表示编号为ai的工人想生产 一个第Li阶段的零件。轩轩想知道对于每张工单,他是否需要给别人提供原材料。他 知道聪明的你一定可以帮他计算出来!

【输入格式】

输入文件名为work.in。

第一行两个正整数n,m和q,分别表示工人的数目、传送带的数目和工单的数目。

接下来m行,每行两个正整数u和v,表示编号为u和v的工人之间存在 一条零 件传输带。保证u≠v。

接下来q行,每行两个正整数a和L,表示编号为a的工人想生产 一个第L阶段 的零件。

【输出格式】

输出文件名为work . out。

共q行,每行一个字符串“Yes”或者“No”。如果按照第i张工单生产,需要编号为 1的轩轩提供原材料,则在第i行输出“Yes”;否则在第i行输出“No”。注意输出不含 引号。

【输入输出样例 1】

【输入输出样例1说明】

编号为1的工人想生产第1阶段的零件,需要编号为2的工人提供原材料。

编号为2的工人想生产第1阶段的零件,需要编号为1和3的工人提供原材料。

编号为3的工人想生产第1阶段的零件,需要编号为2的工人提供原材料。

编号为1的工人想生产第2阶段的零件,需要编号为2的工人生产第1阶段的零 件,需要编号为1和3的工人提供原材料。

编号为2的工人想生产第2阶段的零件,需要编号为1和3的工人生产第1阶段 的零件,他/她们都需要编号为2的工人提供原材料。

编号为3的工人想生产第2阶段的零件,需要编号为2的工人生产第1阶段的零件,需要编号为1和3的工人提供原材料。

【输入输出样例2】

【输入输出样例2说明】

编号为1的工人想生产第1阶段的零件,需要编号为2和5的工人提供原材料。

编号为1的工人想生产第2阶段的零件,需要编号为2和5的工人生产第1阶段 的零件,需要编号为1,3,4 的工人提供原材料。

编号为1的工人想生产第3阶段的零件,需要编号为2和5的工人生产第2阶段的零件,需要编号为1,3,4的工人生产第1阶段的零件,需要编号为2,3,4,5 的工人提供 原材料。

编号为1的工人想生产第4阶段的零件,需要编号为2和5的工人生产第3阶段 的零件,需要编号为1,3,4的工人生产第2阶段的零件,需要编号为2,3,4,5 的工人生产 第1阶段的零件,需要全部工人提供原材料。

编号为1的工人想生产第5阶段的零件,需要编号为2和5的工人生产第4阶段 的零件,需要编号为1,3,4的工人生产第3阶段的零件,需要编号为2,3,4,5 的工人生产 第2阶段的零件,需要全部工人生产第1阶段的零件,需要全部工人提供原材料。

【数据规模与约定】

共20个测试点。

参考答案:对于每张工单,我们需要判断工人是否需要编号为1的轩轩提供原材料。


喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:全国信息学奥林匹克联赛(NOIP2019)复赛 普及组参考答案

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share