2020年团体程序设计天梯赛-总决赛 L2-2 口罩发放

本文介绍了一个针对市民口罩发放的小程序设计案例。该程序通过输入市民的申请信息,并根据一定的规则筛选出符合条件的申请人,实现口罩的有效分配。文章提供了具体的设计思路、输入输出格式以及示例代码。

L2-2 口罩发放 (25分)

为了抗击来势汹汹的 COVID19 新型冠状病毒,全国各地均启动了各项措施控制疫情发展,其中一个重要的环节是口罩的发放。

某市出于给市民发放口罩的需要,推出了一款小程序让市民填写信息,方便工作的开展。小程序收集了各种信息,包括市民的姓名、身份证、身体情况、提交时间等,但因为数据量太大,需要根据一定规则进行筛选和处理,请你编写程序,按照给定规则输出口罩的寄送名单。

输入格式:

输入第一行是两个正整数 D 和 P(1≤D,P≤30),表示有 D 天的数据,市民两次获得口罩的时间至少需要间隔 P 天。

接下来 D 块数据,每块给出一天的申请信息。第 i 块数据(i=1,⋯,D)的第一行是两个整数 T​i​​ 和 S​i​​ (1≤T​i​​ ,S​i​​ ≤1000),表示在第 i 天有 T​i​​ 条申请,总共有 S​i​​ 个口罩发放名额。随后 T​i​​ 行,每行给出一条申请信息,格式如下:

姓名 身份证号 身体情况 提交时间

给定数据约束如下:

姓名 是一个长度不超过 10 的不包含空格的非空字符串;
身份证号 是一个长度不超过 20 的非空字符串;
身体情况 是 0 或者 1,0 表示自觉良好,1 表示有相关症状;
提交时间 是 hh:mm,为24小时时间(由 00:00 到 23:59。例如 09:08。)。注意,给定的记录的提交时间不一定有序;
身份证号 各不相同,同一个身份证号被认为是同一个人,数据保证同一个身份证号姓名是相同的。

能发放口罩的记录要求如下:

身份证号 必须是 18 位的数字(可以包含前导0);
同一个身份证号若在第 i 天申请成功,则接下来的 P 天不能再次申请。也就是说,若第 i 天申请成功,则等到第 i+P+1 天才能再次申请;
在上面两条都符合的情况下,按照提交时间的先后顺序发放,直至全部记录处理完毕或 S​i​​ 个名额用完。如果提交时间相同,则按照在列表中出现的先后顺序决定。

输出格式:

对于每一天的申请记录,每行输出一位得到口罩的人的姓名及身份证号,用一个空格隔开。顺序按照发放顺序确定。

在输出完发放记录后,你还需要输出有合法记录的、身体状况为 1 的申请人的姓名及身份证号,用空格隔开。顺序按照申请记录中出现的顺序确定,同一个人只需要输出一次。

输入样例:

4 2
5 3
A 123456789012345670 1 13:58
B 123456789012345671 0 13:58
C 12345678901234567 0 13:22
D 123456789012345672 0 03:24
C 123456789012345673 0 13:59
4 3
A 123456789012345670 1 13:58
E 123456789012345674 0 13:59
C 123456789012345673 0 13:59
F F 0 14:00
1 3
E 123456789012345674 1 13:58
1 1
A 123456789012345670 0 14:11

输出样例:

D 123456789012345672
A 123456789012345670
B 123456789012345671
E 123456789012345674
C 123456789012345673
A 123456789012345670
A 123456789012345670
E 123456789012345674

样例解释:

输出中,第一行到第三行是第一天的部分;第四、五行是第二天的部分;第三天没有符合要求的市民;第六行是第四天的部分。最后两行按照出现顺序输出了可能存在身体不适的人员。

作者 DAI, Longao
单位 杭州百腾教育科技有限公司
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB

题解

只得了20分的代码

#include<bits/stdc++.h>
#include<map>
#define N 1003
using namespace std;
struct Node {
   
   
	string name;
	string id;
	int flag;
	int hh,mm;
	int t;
} a[N],ans[N];

int d,p;
int t,s;
int anscnt;

map<string, int> mp;
map<string, int> vis;

bool cmp(Node x
### 关于连续因子问题的解题思路 对于团体程序设计天梯赛总决赛中的连续因子问题,其核心在于寻找给定整数的最大连续因子分解长度以及具体的连续因子序列。以下是详细的算法分析与实现: #### 问题描述 给定一个正整数 \( N \),找出它的一组最长的连续因数组合,使得这些连续因子的乘积等于 \( N \)[^1]。 --- #### 算法解析 为了高效解决该问题,可以采用如下方法: 1. **枚举起点** 枚举可能的连续因子起始值 \( i \)(从 2 开始),并尝试扩展连续区间直到当前区间的乘积超过目标值 \( N \)。 2. **判断条件** 如果某个连续区间的乘积恰好等于 \( N \),记录下这个区间的长度和具体数值组合;如果发现更长的有效区间,则更新最优解。 3. **优化剪枝** 当前累积乘积一旦超出 \( N \),立即停止对该起始点的进一步探索,从而减少不必要的计算开销。 4. **边界处理** 特殊情况下,比如输入为质数时,不存在任何有效的连续因子分解方案,此时应返回单个数字本身作为唯一的结果。 --- #### Python 实现代码 下面提供了一种基于上述逻辑的具体编程实现方式: ```python def max_consecutive_factors(n): best_len = 0 result = [] # 尝试不同的起始位置 for start in range(2, n): product = 1 temp_list = [] # 扩展连续范围 current = start while product * current <= n: product *= current temp_list.append(current) if product == n and len(temp_list) > best_len: best_len = len(temp_list) result = temp_list.copy() current += 1 return (best_len, result) # 测试函数调用 if __name__ == "__main__": number = int(input()) length, factors = max_consecutive_factors(number) print(length) print(' '.join(map(str,factors))) ``` 此段脚本定义了一个名为 `max_consecutive_factors` 的功能模块来执行主要运算过程,并通过标准输入接收待测数据实例进行验证展示最终输出结果形式满足题目规定的要求。 --- ### 结果解释 运行以上代码后,会先读取用户输入的一个整数 \( N \),接着打印出两个部分的信息:首先是最大连续因子的数量,其次是构成这一串连续因子的具体列表成员,两者之间由空白行隔开以便清晰区分显示效果。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值