蓝桥杯每日真题 - 第17天

ops/2024/11/24 2:02:11/

题目:(最大数字)

题目描述(13届 C&C++ B组D题)

993ce3d31e284e10a88d64acff769af5.png

题目分析: 

  • 操作规则

    • 1号操作:将数字加1(如果该数字为9,变为0)。

    • 2号操作:将数字减1(如果该数字为0,变为9)。

  • 目标

    • 通过操作,将数字尽可能变大。

  • 限制

    • 总操作次数受限于 A 次1号操作和 B 次2号操作。

  • 核心问题

    • 在有限操作次数内,如何分配操作次数,使结果数字最大化?

解题思路:

  1. 优先级策略

    • 优先将当前位变成9,因为9是所有个位数中最大的数;

    • 根据剩余操作次数,依次考虑其他位。

  2. 递归解决

    • 每次递归针对某一位:

      • 尝试使用1号操作尽量向9靠拢;

      • 尝试使用2号操作绕过0靠拢9;

      • 比较两种策略下的最终结果,选择字典序更大的路径。

  3. 终止条件

    • 遍历到数字的末尾;

    • 可用操作次数(A 或 B)为0。

  4. 动态更新数字

    • 通过字符串的直接修改,更新当前数字。

代码实现(C语言):

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>
#include<string.h>void foo(char N[], int n, int a, int b) {if (N[n] == '\0') {return;}int poDis, neDis;int na, nb;char Na[20], Nb[20];poDis = 9 - (N[n] - '0');neDis = 10 + (N[n] - '0') - 9;if (a >= poDis && b >= neDis) {N[n] = '9';strcpy(Na, &N[n + 1]);strcpy(Nb, &N[n + 1]);foo(Na, 0, a - poDis, b);foo(Nb, 0, a, b - neDis);if (strcmp(Na, Nb) >= 0) {strcpy(&N[n + 1], Na);}else {strcpy(&N[n + 1], Nb);}}else if (a >= poDis) {a -= poDis;N[n] = '9';foo(N, n + 1, a, b);}else if (b >= neDis) {b -= neDis;N[n] = '9';foo(N, n + 1, a, b);}else {na = N[n] - '0' + a;nb = (10 + N[n] - '0' - b) % 10;if (na > nb) {N[n] = na + '0';a = 0;foo(N, n + 1, a, b);}else if (na < nb) {N[n] = nb + '0';b = 0;foo(N, n + 1, a, b);}else {N[n] = na + '0';strcpy(Na, &N[n + 1]);strcpy(Nb, &N[n + 1]);foo(Na, 0, 0, b);foo(Nb, 0, a, 0);if (strcmp(Na, Nb) >= 0) {strcpy(&N[n + 1], Na);}else {strcpy(&N[n + 1], Nb);}}}
}int main() {char N[20];int a, b;// inscanf("%s%d%d", N, &a, &b);// mainfoo(N, 0, a, b);// outprintf("%s", N);return 0;
}

 

得到运行结果:

d9eb7eb118314c9bbfec6b8c72b561a0.png

代码分析: 

  • 递归函数设计

    • 参数包括当前处理的位数、剩余的1号和2号操作次数。

    • 每次递归后更新字符串,并返回最佳结果。

  • 字符串操作

    • 为了保持数字位数的变化状态,利用字符串操作更新数字。

  • 状态转移

    • 如果可以使用1号操作,则递归尝试将当前位增加到9;

    • 如果可以使用2号操作,则递归尝试将当前位绕过0变成9;

    • 两种结果之间选择更优解。

 

难度分析

⭐️⭐️⭐️⭐️

 

总结

本题通过递归枚举所有可能的操作路径,并选择字典序最大的结果数字。通过合理的操作分配和优先级选择,可以在操作次数受限的情况下达到优化效果。递归的设计逻辑清晰,代码实现具有较好的通用性和扩展性。

 

 


http://www.ppmy.cn/ops/136194.html

相关文章

redis工程实战介绍(含面试题)

文章目录 redis单线程VS多线程面试题**redis是多线程还是单线程,为什么是单线程****聊聊redis的多线程特性和IO多路复用****io多路复用模型****redis如此快的原因** BigKey大批量插入数据测试数据key面试题海量数据里查询某一固定前缀的key如果生产上限值keys * &#xff0c;fl…

掌握SEO提升网站流量的关键在于长尾关键词的有效运用

内容概要 在现代数字营销中&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;被广泛视为提升网站流量的核心策略之一&#xff0c;而其中长尾关键词的运用显得尤为重要。长尾关键词通常由三个或更多个词组成&#xff0c;具有更高的针对性和精确度&#xff0c;可以更好地满足…

第九章 使用Apache服务部署静态网站

1. 网站服务程序 1970 年&#xff0c;作为互联网前身的 ARPANET&#xff08;阿帕网&#xff09;已初具雏形&#xff0c;并开始向非军用部门开放&#xff0c;许多大学和商业机构开始陆续接入。虽然彼时阿帕网的规模&#xff08;只有 4 台主机联网运行&#xff09;还不如现在的…

2024年11月17日Github流行趋势

项目名称&#xff1a;codecrafters-io / build-your-own-x 项目维护者&#xff1a;danistefanovic, rohitpaulk, sarupbanskota, fake-rookie, bauripalash等项目介绍&#xff1a;通过从头开始重新创建你最喜欢的技术来掌握编程。项目star数&#xff1a;310,978项目fork数&…

生日主题的烟花特效HTML,CSS,JS

目录 图片展示 完整代码 关键点解释 图片展示 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><t…

开发 + 安全:网络安全的协作方法

开发团队和安全团队之间由来已久的紧张关系一直是组织内部摩擦的根源。开发人员优先考虑速度和效率&#xff0c;旨在通过快节奏、迭代的开发周期快速交付功能和产品并高效前进。另一方面&#xff0c;安全团队努力平衡风险和创新&#xff0c;但必须专注于使用护栏保护敏感数据和…

Django项目 | 实现登录注册验证电子邮箱

在实现登录验证电子邮箱时&#xff0c;需要确保模型中包含电子邮箱字段 自定义用户模型登录验证电子邮箱实现 1. 模型&#xff08;Model&#xff09; 确保自定义用户模型中包含电子邮箱字段。例如&#xff1a; from django.contrib.auth.models import AbstractUser from d…

创建可重用React组件的实用指南

尽管React是全球最受欢迎和使用最广泛的前端框架之一&#xff0c;但许多开发者在重构代码以提高可复用性时仍然感到困难。如果你发现自己在React应用中不断重复相同的代码片段&#xff0c;那你来对地方了。 在本教程中&#xff0c;将向你介绍三个最常见的特征&#xff0c;表明是…