酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

c++实现: 题目描述 “五一”放假了,爸爸总算答应小华可以在上午玩益智游戏。小华飞快地下载了一个名叫“快乐五一”的游戏,准备大显身手了。安装、运行,接着出现了一个 “请输入密码:” 的输入框,密码是什么呢? 小华看了一下说明,原来每次开始运行游戏都会在界面上显示一个小于 150 位的正整数 N , 同时显示一个密码破解钥匙 S( S 为正整数且小于 N 的位数),只要将正整数N去掉其中任意 S 个数字后使剩下的数最小,这个最小数就是密码。例如:N=2813465, S=4 时可以删去 2,8,6,5 得到最小数 134,密码就是 134 。这可难不倒小华,他号称学校信息学竞赛的“编程高手”呢。很快他就编写出了一个专门破解密码的程序。请你编写一个这样的程序,只要从键盘输入 N 和 S 就可以输出密码是什么。 输入格式 两个整数 N 和 S ,含义如题所示。 输出格式 一个 S位的整数,表示密码; 样例输入1 2813465 4 样例输出1 134 样例输入2 1032 2 样例输出2 2

# C++实现:删除数字使剩余数最小 以下是解决这个问题的C++实现代码,使用贪心算法思想: ```cpp #include <iostream> #include <string> #include <vector> using namespace std; string findMinNumber(string num, int s) { vector<char> stack; for (char digit : num) { while (!stack.empty() && s > 0 && stack.back() > digit) { stack.pop_back(); s--; } stack.push_back(digit); } // 如果还需要删除更多数字,从末尾删除 while (s > 0 && !stack.empty()) { stack.pop_back(); s--; } // 构建结果字符串 string result; for (char digit : stack) { result += digit; } // 去除前导零 size_t nonZero = result.find_first_not_of('0'); if (nonZero != string::npos) { result = result.substr(nonZero); } else { result = "0"; // 全为零的情况 } return result.empty() ? "0" : result; } int main() { string N; int S; cin >> N >> S; string password = findMinNumber(N, S); cout << password << endl; return 0; } ``` ## 代码说明 1. 使用贪心算法思想,维护一个栈结构 2. 遍历数字字符串,当栈顶数字大于当前数字时弹出栈顶(这样可以确保剩余数字最小) 3. 处理完所有数字后,如果还需要删除更多数字,从末尾删除 4. 最后去除结果中的前导零 ## 测试用例验证 样例输入1: ``` 2813465 4 ``` 输出: ``` 134 ``` (删除2,8,6,5) 样例输入2: ``` 1032 2 ``` 输出: ``` 2 ``` (删除1和0) ## 注意事项 1. 算法时间复杂度为O(n),n为输入数字的位数 2. 需要特别注意前导零的处理 3. 当删除所有数字后剩余零的情况需要特殊处理 [2025-06-20 16:08:21 | AI写代码神器 | 473点数解答]

相关提问