8605 删数问题
问题描述: 给定n位正整数a,去掉其中任意k个数字后,剩下的数字按原次序排列成一个新的正整数。 算法设计: 给定n (1<=n<=200)位的正整数a和k,此时,k小于n。 试着设计一个算法,找出删去k个数,剩下数字组成的新数最小的删数方案。 ### 8605 删数问题 #### 问题描述 本问题要求处理一个特定的数学挑战:给定一个由 `n` 位组成的正整数 `a` 和一个正整数 `k`(其中 `k < n`),任务是找到一种方法,通过删除 `a` 中的 `k` 个数字,使得剩余数字按照原有的顺序重新组合成一个新的正整数,并且这个新正整数尽可能小。 #### 算法设计与分析 为了解决这个问题,我们需要设计一个有效的算法来确定哪些数字应该被删除以及如何保留其余的数字以构成最小可能的数字。下面我们将详细介绍算法的设计思路、实现细节以及一些关键步骤。 ##### 设计思路 1. **初始化**:首先读入 `n` 位的正整数 `a` 和待删除的数字数量 `k`。 2. **遍历数字**:从左到右遍历 `a` 的每一位数字。 3. **比较并删除**:在遍历过程中,如果当前数字比前面的某个数字大,则考虑是否可以删除前面较大的数字来确保剩余数字构成的序列尽可能小。 4. **记录删除位置**:记录下每次删除操作的位置,以便后续构造出最小的新数。 5. **构建结果**:根据记录的删除位置,构造出最小的新数。 ##### 实现细节 代码中使用了多个数组来辅助实现: - `char put[100][200]`:用于存储每次尝试得到的最小数的结果。 - `int count = 0, co = 0`:`count` 记录了成功尝试的次数,而 `co` 用于标记删除数字的位置。 - `int tmn[100]`:记录每次尝试时,新数的起始位置。 - `void output(char a[], int i, int n)`:核心函数,用于执行删除操作并记录结果。 ##### 关键步骤 1. **读取输入**:读入 `n` 位正整数 `a` 和待删除的数字数量 `k`。 2. **执行删除操作**: - 遍历数字 `a`。 - 检查每个数字是否可以被删除以形成更小的数。 - 使用 `output` 函数进行实际的删除操作。 3. **记录结果**: - 将每次尝试得到的最小数记录在 `put` 数组中。 - 更新 `count` 和 `tmn` 数组以记录尝试次数和新数的起始位置。 4. **输出结果**:最终输出所有尝试得到的最小数。 #### 示例解释 假设输入为 `12345` 和 `2`,即需要从 `12345` 中删除两个数字来获得最小的新数。 - 首先尝试删除第一个数字 `1`,剩余数字为 `2345`,但这不是最优解。 - 接着尝试删除第一个数字 `2`,剩余数字为 `1345`。 - 继续尝试删除第二个数字 `3`,剩余数字为 `1245`,这仍然是一个更优的选择。 - 最后尝试删除第二个数字 `4`,剩余数字为 `1235`,这不是最优解。 - 因此,最终的答案是 `1245`。 #### 总结 该算法的核心在于动态地决定哪些数字应该被删除以形成尽可能小的新数。通过遍历数字并记录每次尝试的结果,我们可以找到最优解。需要注意的是,这种方法在最坏情况下可能会有较高的时间复杂度,特别是在 `n` 较大的情况下。然而,在实际应用中,对于较小的 `n` 值(如题目中的限制条件 `1 <= n <= 200`),这种方法是非常实用且高效的。
#include "string.h"
char put[100][200];
int count=0,co=0;
int tmn[100];
void output(char a[],int i,int n){
int j=0,k,l=0;
int flag=0;
tmn[co]=i-n;
co++;
for(;j<n;j++){
for(k=1,l=0;k<i;k++){
if(a[k]<a[k-1])
{
l=k-1;
flag=1;
break;
}
}
if(flag){
for(;l<i-1;l++){
a[l]=a[l+1];
}}
i--;
flag=0;
}
for(j=0;j<tmn[co-1];j++)
{
put[count][j]=a[j];
- zhang58231012013-06-25还算能用,不错
- 新晴余快2013-12-09mac下亲测可用了,辛苦楼主分享了。
- OscaradnBen2014-05-10能用,比网上其他的答案要更好,通过了
- admiral172012-12-01跟题目的要求一样,比网上其他的答案要更好,通过了。
- 粉丝: 0
- 资源: 11
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助