news 2026/7/5 2:16:29

CSP 真题解析:[CSP-J 2024-T3] 小木棍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CSP 真题解析:[CSP-J 2024-T3] 小木棍

[CSP-J 2024-T3] 小木棍

摘要:本题是 CSP-J 2024 第三题,要求用恰好n nn根长度相等的小木棍拼出一个无前导零的正整数,并使该数尽可能小。题解采用贪心 + 模 7 分类讨论:优先用木棍数最多的数字8(7 根)以减少位数,再根据n m o d 7 n \bmod 7nmod7的余数调整最高位数字,最终在位数最少的前提下使高位最小。需注意n = 6 n=6n=6时不能输出0n ≥ 17 n \geq 17n17且余数为 3 时应输出200...等易错细节。

题目描述

小 S 喜欢收集小木棍。在收集了n nn根长度相等的小木棍之后,他闲来无事,便用它们拼起了数字。用小木棍拼每种数字的方法如下图所示。

现在小 S 希望拼出一个整数,满足如下条件:

小 S 想知道这个数是多少,可n nn很大,把木棍整理清楚就把小 S 折腾坏了,所以你需要帮他解决这个问题。如果不存在正整数满足以上条件,你需要输出− 1 -11进行报告。

输入格式

本题有多组测试数据。

输入的第一行包含一个正整数T TT,表示数据组数。

接下来包含T TT组数据,每组数据的格式如下:

一行包含一个整数n nn,表示木棍数。

输出格式

对于每组数据:输出一行,如果存在满足题意的正整数,输出这个数;否则输出− 1 -11

输入输出样例 #1

输入 #1

5 1 2 3 6 18

输出 #1

-1 1 7 6 208

说明/提示

【样例 1 解释】

【数据范围】

对于所有测试数据,保证:1 ≤ T ≤ 50 1 \leq T \leq 501T501 ≤ n ≤ 10 5 1 \leq n \leq 10^51n105

测试点编号n ≤ n\leqn特殊性质
1 1120 2020
2 2250 5050^
3 3310 3 10^3103A
4 , 5 4,54,510 5 10^5105^
6 6610 3 10^3103B
7 , 8 7,87,810 5 10^5105^
9 9910 3 10^3103
10 101010 5 10^5105^

特殊性质 A:保证n nn7 77的倍数且n ≥ 100 n \geq 100n100

特殊性质 B:保证存在整数k kk使得n = 7 k + 1 n = 7k + 1n=7k+1,且n ≥ 100 n \geq 100n100

思路要点

我们手里有n nn根木棍,要拼出一个正整数(不能有前导0 00),要求恰好用完n nn根木棍,并且让这个正整数尽可能小

首先,我们要明确每个数字需要消耗的木棍数量:

撇开题目中“小木棍拼数字”的背景外壳,这道题的本质是:贪心算法(Greedy) + 整数模运算与分类讨论。在给定的数字总和(木棍数)限制下,组合出位数最少、且高位数字最小的数。

关键思路

如何让拼出来的数字“尽可能小”?这里有两个核心的贪心策略

基于以上两点,我们可以用n nn除以 7:

解题步骤

我们以样例输入中的n = 18 n = 18n=18为例,模拟代码的执行过程:

  1. 变量定义与初始化:

    定义全局变量int T, n;用于存储测试组数和当前木棍数。

    定义辅助函数void prt(int k),用于连续输出k kk个数字8

  2. 读入数据:

系统读入T = 5 T = 5T=5,表示有 5 组数据。

进入while(T--)循环,读入当前组的木棍数n = 18 n = 18n=18

  1. 条件分支判断:

    首先判断n < 2,不成立(最少摆出数字 1 需要 2 根木棍)。

    再判断n < 8,不成立(18 ≥ 8 18 \ge 8188)。程序进入else分支,开始核心的模 7 分类讨论

  2. 公式计算与输出:k = 18 / 7 = 2 k = 18 / 7 = 2k=18/7=2r = 18 ( m o d 7 ) = 4 r = 18 \pmod 7 = 4r=18(mod7)=4

程序进入switch(r),匹配到case 4:据贪心原则,余下 4 根木棍加上一个8(7 根)共 11 根木棍。能拼出的最小两位数是202用 5 根,0用 6 根,5 + 6 = 11 5 + 6 = 115+6=11)。

执行printf("20");。执行prt(--k);:此时k自减 1 变成 1,调用函数打印 1 个8

  1. 最终输出结果:208
本题易错点

参考代码

#include<bits/stdc++.h>usingnamespacestd;intT,n;// T: 测试数据组数, n: 每组的木棍数量// 工具函数:连续打印 k 个数字 8voidprt(intk){for(inti=1;i<=k;i++){printf("8");}}intmain(){scanf("%d",&T);while(T--){scanf("%d",&n);// 特殊情况 1:少于 2 根木棍,无法拼出任何正整数if(n<2){printf("-1");}// 特殊情况 2:个位数木棍,直接特判输出最优解elseif(n<8){switch(n){case2:printf("1");break;case3:printf("7");break;case4:printf("4");break;case5:printf("2");break;case6:printf("6");break;// 注意:不能是 0,因为要求正整数case7:printf("8");break;}}// 通用情况:n >= 8,采用模 7 贪心策略else{intk=n/7;// 最多可以拼出的 8 的个数intr=n%7;// 模 7 的余数switch(r){case0:// 恰好整除,全部填 8prt(k);break;case1:// 余 1 根:向 8 借 1 根凑成 8 根,拼出 "10"printf("10");prt(--k);break;case2:// 余 2 根:直接在最前面放 "1" (2根),剩下填 8printf("18");prt(--k);break;case3:// 余 3 根:分情况讨论if(n<17){// 也就是 n = 10 的特殊情况printf("22");}else{// n >= 17 时,借两个 8 凑成 17 根,拼出 "200"printf("200");prt(k-2);}break;case4:// 余 4 根:借一个 8 凑成 11 根,拼出 "20"printf("20");prt(--k);break;case5:// 余 5 根:借一个 8 凑成 12 根,拼出 "28"printf("28");prt(--k);break;case6:// 余 6 根:借一个 8 凑成 13 根,拼出 "68"printf("68");prt(--k);break;}}printf("\n");// 每组数据输出完毕后换行}return0;}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 2:15:03

基于Visual Studio 2010 进行敏捷/Scrum模式开发

Visual Studio 2010 是微软在2010年4月发布的全新一代的集成开发环境&#xff0c;配合同时发布的Team Foundation Server 2010&#xff08;TFS——团队服务器&#xff09; &#xff0c;为开发团队提供了全面的应用程序生命周期管理&#xff08;ALM&#xff09;工具和平台。在20…

作者头像 李华
网站建设 2026/7/5 2:13:50

C#与正运动技术实现工业自动化运动控制开发指南

1. 正运动仿真软件与C#开发环境概述正运动技术的仿真软件在工业自动化领域有着广泛应用&#xff0c;其与C#语言的结合为开发者提供了强大的运动控制解决方案。这套系统主要由运动控制卡&#xff08;如XPCIE系列&#xff09;、实时内核和上位机开发环境组成&#xff0c;通过Ethe…

作者头像 李华
网站建设 2026/7/5 2:12:49

ComfyUI Desktop 实例进入后一直loading的问题解决

问题描述&#xff1a;加入新插件后&#xff0c;重启ComfyUI Desktop, 发现软件一直在loading页。问题排查&#xff1a;C:\Users\你的用户名\AppData\Roaming\Comfy Desktop\ 找你的软件日志&#xff0c;将日志交给Ai分析。问题解决&#xff1a;经过AI分析得知&#xff0c;此问…

作者头像 李华
网站建设 2026/7/5 2:12:46

LB200倒置相差显微镜:类器官与器官芯片生命科学的前沿窗口

LB200****倒置相差显微镜&#xff1a;类器官与器官芯片生命科学的前沿窗口 在再生医学与精准医疗飞速发展的今天&#xff0c;类器官&#xff08;Organoids&#xff09;与器官芯片&#xff08;Organ-on-a-Chip&#xff09;技术正领着生物医学研究的新革命。类器官是在体外环境下…

作者头像 李华