这学期在上算法与设计这本书,本人真的C语言非常非常菜,以至于这道题我花了4个下午和2个晚上才做出来,贪婪算法的删数问题网上有很多相关资料,不过都是要求最后组成的整数最小,但可悲我们的作业要求最后组成的整数最大(对我这个菜鸟来说一点点改动都可能给我巨大的挑战),我要在这里记录下我思考的历程!!!以便日后让我自己知道我当时脑子是怎么想的!!!
我们提交算法作业是在这个网站:清览题库 (qingline.net),真的好用,可以找出算法的很多bug,但也有一些鸡肋的地方,感兴趣的可以去体会。
题目:苦逼的小明正在面对着一个很长很长的正整数苦恼,这个正整数由n个数字组成。现在小明被要求在这n个数字中删掉s个数字,剩下的数字按原来的左右次序重新组成一个新的整数。现在小明希望这个新组成的整数尽量大
输入:由n个数字组成的正整数和s
输出:新组成的最大正整数
数据范围:1<=n<=100,0<=s<=n
输入样例:311111111111111111112 2
输出:3111111111111111112
第一阶段:我拿到这道题,我在想:我需要一个字符串数组,然后因为要索引我需要把字符串数组转换成整型数组才可以,当时我真的这么想的!!!然后本来数组没学好,是上课没听的没学好,于是花了一个下午寻找我这个字符串变成整型数组的C语言怎么写,我先char n[100]定义了一个字符串数组,关于我输入方法的寻找过程是:
scanf("%s", n); //这种2022版的visual stdio不通过--->
fgets(n, 100, stdin); //后来在老师了解这个fgets会读取换行符,又不行!!--->
gets_s(n); //这个在我们要提交的清览平台上不通过!!但是在2022版的visual stdio可以通过!--->
scanf("%s", n); //后来发现这个在我们要提交的清览平台上可以通过!!,我又又行了!!!
//最后我决定在清览平台用scanf语法,在2022版的visual stdio用gets_s调试,反正我是两边跑代码!!
我之后还找到了一篇很详细的介绍这几种方法的文章:
(54条消息) c语言常量换行符,C语言中换行符问题_weixin_39723441的博客-CSDN博客
我是在这里发现居然还有gets_s这种方法!!!看到这篇文章才发现我真的基础很薄弱!!我这些基本不知道!
接下来是重要的算法设计!我实在不理解说明是贪婪算法,我理解能力真的有点差的!我习惯在网上找代码然后改一改这种很偷懒的方法,但是浏览网上资料全部!都是!求最小值,而且大多是用C++,python写的,我有幸找到了一篇!调试无错误,但是运行不出来!!尝试改也改不对,哎终究是我不理解他得到算法的逻辑!
后来实在没办法只能自己看书写,书上也是求最小值的(有苦说不出),《算法设计与分析》这本书的算法排版比较乱,写的简单,如他只会告诉你input(n),然后两个for循环本来应该嵌套的,他会直接并列写出,所以我看的也很吃力,因为要搞懂算法的意思真的有点难,花了一个下午和一个晚上写的代码:
完整代码:
#include<stdio.h>
#include<string.h>//stlen()这些库函数在这个头文件中
int del(char n[], int b, int k) {//n为字符串数组,b为要删除的数字的数组索引,k为删除个数k=1
int i1;
for (i1 = b; i1 <= strlen(n) - k; i1++) {
n[i1] = n[i1 + k];//从后面一个数字向前一个数字覆盖,最后吧要删除的数字覆盖
}
return 0;
}
int main()
{
char n[100];
scanf("%s",n);
//gets_s(n)
int s, i, j,len;
int del(char n[], int b, int k);
scanf("%d", &s);
len = strlen(n);
if(s==len||s>len){ //处理要删除的个数大于等于字符串长度的情况
printf("0");
}
else{
for (i = 1; i <=s; i++) { //循环几次即要删除几个数
for (j = 0; j < strlen(n); j++) {
if (n[j] < n[j + 1]) { //如果是大于等于,回到内层for循环,j++
del(n, j, 1);
//j1 = j;
break; //跳出内层循环,回到外层for循环,
}
if (j == len-i-1) { //当删掉了一些数字后,其余数字为递减序列的情况
del(n, j+1, 1);
break;
}
}
}
printf("%s",n);
}
}
不知道这里面有没有用到贪婪算法的思想,还没理解透哎
路漫漫其修远兮,吾将上下而求索。