E-喊7的次数重排(100p)
刷题笔记合集🔗
喊7的次数重排
问题描述
喊7是一个传统的聚会游戏。 个人围成一圈,按顺时针从 1 到
编号。游戏规则如下:
- 编号为 1 的人从 1 开始喊数。
- 下一个人喊的数字为上一个人的数字加 1。
- 当将要喊出来的数字是 7 的倍数或者数字本身含有 7 时,不能直接喊出这个数字,而是要喊"过"。
- 假定所有人都没有失误地在正确的时机喊了"过"。
现在,给定一个长度为 的数组,存储了打乱顺序的每个人喊"过"的次数。你的任务是将它还原成正确的顺序,即数组的第
个元素应存储编号
的人喊"过"的次数。
输入格式
输入为一行,包含空格分隔的喊"过"的次数。数字的个数即为 。
输出格式
输出为一行,包含顺序正确的喊"过"的次数,用空格分隔。
样例输入1
0 1 0
样例输出1
1 0 0
样例输入2
0 0 0 2 1
样例输出2
0 2 0 1 0
样例解释
| 样例1 | 一共只有一次喊"过",那只会发生在需要喊 7 时。按顺序,编号为 1 的人会遇到 7,故输出 1 0 0。注意:结束时的 |
| 样例2 | 一共有三次喊"过",发生在 7、14、17。按顺序,编号为 2 的人会遇到 7 和 17,编号为 4 的人会遇到 14,故输出 0 2 0 1 0。 |
数据范围
题解
这道题目的核心在于模拟喊7游戏的过程,并记录每个人喊"过"的次数。
解题思路如下:
- 首先,我们需要计算出总共喊"过"的次数,即输入数组的和。
- 然后,我们从 1 开始模拟喊数的过程,直到喊"过"的次数达到总数。
- 在模拟过程中,我们需要判断当前数字是否需要喊"过"(是 7 的倍数或含有 7)。
- 如果需要喊"过",我们就给当前玩家的计数器加 1。
- 每喊完一个数,我们就移动到下一个玩家,注意要循环到第一个玩家。
参考代码
- Python
# 读取输入并转换为整数列表
a = list(map(int, input().split()))
# 计算总的"过"的次数
s = sum(a)
# 获取玩家数量
n = len(a)
# 初始化结果列表,用于存储每个玩家喊"过"的次数
p = [0] * n
# 初始化当前数字和当前玩家索引
i = 1 # 从1开始喊数
j = 0 # 从第一个玩家开始
# 模拟喊数过程
while s > 0:
# 判断当前数字是否需要喊"过"
if i % 7 == 0 or '7' in str(i):
s -= 1 # 减少剩余的"过"的次数
p[j] += 1 # 当前玩家喊"过"的次数加1
i += 1 # 数字加1
j = (j + 1) % n # 移动到下一个玩家,使用模运算实现循环
# 输出结果,将整数列表转换为字符串并用空格连接
print(' '.join(map(str, p)))
#include <stdio.h>
#include <string.h>
// 判断一个数字是否包含7
int contains7(int num) {
while (num > 0) {
if (num % 10 == 7) return 1;
num /= 10;
}
return 0;
}
int main() {
int a[100], p[100] = {0};
int n = 0, s = 0;
// 读取输入
while (scanf("%d", &a[n]) != EOF) {
s += a[n];
n++;
}
int i = 1, j = 0;
// 模拟喊数过程
while (s > 0) {
if (i % 7 == 0 || contains7(i)) {
s--;
p[j]++;
}
i++;
j
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
算法刷题笔记 文章被收录于专栏
本专栏收集并整理了一些刷题笔记
叮咚买菜工作强度 89人发布
