题解(团队竞赛)
2026-08-11 16:12:27
发布于:浙江
哈哈,是不是很期待题解,题解来了!
此消息最好是战队成员看,请加入团队后关注,竞赛名请在战队了解
战队链接:战队链接
以下是题解:
第一题:解密码
1.理解“字典序”与“暴力尝试”的关系
题目中提到“从最小的数字开始一个一个尝试”,例如 0123 -> 0124 ... -> 9876。这实际上就是将所有由 0-9中选取4个不同数字 组成的四位数,按照数值从小到大(即字典序)进行排列。
2.确定总空间
第一位有 10 种选择 (0-9)
第二位有 9 种选择 (剩余9个)
第三位有 8 种选择 (剩余8个)
第四位有 7 种选择 (剩余7个)
总共10×9×8×7=5040种可能的密码。题目保证 𝑛<5040,所以一定有解。
3.解题策略:生成第 n+1 个排列
小明已经尝试了𝑛组,意味着他试过了排序后的前 𝑛个密码。下一组应该尝试的是排序后的第𝑛+1个密码。由于𝑁最大只有 5040,数据量非常小,可以直接通过程序生成所有合法的排列,排序后取第 𝑛个索引(从0开始计数的话是第𝑛个,因为第1次尝试对应索引0,第𝑛次尝试对应索引 n−1,下一次即索引n)。
步骤:
初始化一个列表,用于存放所有合法的4位不重复数字组合。
使用四层循环或者递归回溯,生成所有𝑎,𝑏,𝑐,𝑑
a, b, c, d 满足 𝑎,𝑏,𝑐,𝑑∈[0,9]
a ,b, c, d∈[0,9] 且互不相同的组合。
将这些组合转换为整数或字符串,并进行升序排序。
直接取出排序后列表中的第
n个元素(假设列表下标从0开始,第1次尝试是索引0,则第𝑛+次尝试是索引n)。
输出该元素的四个数字。
二:口诀
一、核心逻辑判断
边界检查:首先读取输入整数 n。若 n=0,直接输出 Error 并结束程序;若 n>0,则进入循环生成逻辑。
行列遍历:使用双重循环,外层变量 i 控制行(从 1 到 n),内层变量 j 控制列(从 1 到 n)。
格式控制:每个乘法式子格式为 ixj=结果,其中结果需占2位宽度(右对齐,不足补空格),式子之间用一个空格分隔。
二、具体实现步骤
处理特殊情况
条件:若输入 n==0。
动作:打印字符串 Error,终止程序。
生成乘法表
外层循环:i 从 1 遍历至 n,代表当前行号。
内层循环:j 从 1 遍历至 n,代表当前列号。
构造单项:计算乘积 prod=i×j。格式化字符串为 f"{i}x{j}={prod:2d}"(注意 :2d 表示整数占2位,右对齐)。
行内拼接:将当前行生成的 n 个格式化字符串用单个空格 " " 连接。
输出行:打印拼接后的字符串。
三、关键细节说明
域宽为2:使用格式化占位符 %2d确保个位数前有一个空格,两位数正常显示。
分隔符:每两个式子间有一个空格,行末通常无多余空格
符号格式:注意题目使用的是小写 x 而非乘号 * 或 ×。
(四)闰年
首先这道题目考的特别简单,就是函数的定义与方法简单算法
我们用基本语法格式:
返回类型 函数名(参数){
函数体;
}
接着,我们什么叫闰年,闰年的口诀:“四年一闰,百年不闰,四百年再闰。”我们带到变成里就行了。
(五)简单分数 (要求定义my_max函数)
这道题怎么做?看清楚题目的东西即可。
定义my_max。下面给代码。
数据限制:如果不想手动定义比大小函数,那么要用cmath头文件。
数据限制2:这个要保留两位小数,要用printf。
#include <iostream>
#include <cmath>
using namespace std;
double my_max(double e,double s,double p){//如果是要定义的话,那么建议定义三个数的比大小
if(e > s && e > p) return e;
else if(s > e && s > p) return s;
else return p;
//以上为手搓的方式,下面是函数的方式。
//return max[e,s,p];或者return max(max(e,s)p);
}
int main(){
double a,b,c;
cin >> a >> b >> c;
double n = my_max(a, b, c);
double d = my_max(a + b, b, c);
double s = my_max(a, b, b + c);
double result = n / (d * s);
printf("%.2lf", result);
//也可以用官方的
return 0;
}
(六)计算问题
这题特别简单,其实没必要定义函数了。直接给大家代码
#include <iostream>
using namespace std;
int main(){
int a,b,c;
cin >> a >> b >> c;
cout << a * 0.2 + b * 0.3 + c * 0.5;
return 0;
}
(七) 分离函数
思路:
核心思路
要从右边数第
𝑘 位数字,只需执行两步操作:
1.去掉低位:通过整数除法 n / 10 循环 𝑘−1次,将目标位移到个位。
2.取出个位:通过取模运算 n % 10 获取当前的个位数字。
(8)深深的魔力鸡
用动态规划:dp[i] 表示体重为 i 的鸡能生成的序列数。
dp = 1,对每个 i 从 2 到 n,dp[i] = 1 + sum(dp 到 dp[i//2])。
最后输出 dp[n]。
这里空空如也














有帮助,赞一个