贪心算法——寻找剩余最大数
2016-07-03 16:08
876 查看
描述
请在整数 n 中删除m个数字,
使得余下的数字按原次序组成的新数最大,比如当n=92081346718538,m=10时,则新的最大数是9888
输入
第一行输入一个正整数T,表示有T组测试数据
每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数)
输出
每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数
样例输入
2 92081346718538 10 1008908 5
样例输出
9888 98
贪心算法:每一次寻找局部最优,最后使达到全局最优。
这道题贪心算法体现很明显,故记录之。
思路:
首先要明白,在一串数中,我们如果要去掉之中n位后还剩m位,那么剩余的最大数的最高位的位置就不可能在倒数的第(m-1)位到最后一位里面,不然就凑不齐m位整数,与题意矛盾了。
按这个思路,我们寻找剩余m位中的某一位时,都像第一步那样单独考虑。并且,寻找的起始位置不再是0位,而是上一次找到的最大值的下一个位置开始寻找。
题目要求顺序输出,一种方案是找到了就直接输出,另一种方案用临时数组做标记。
代码如下:
请在整数 n 中删除m个数字,
使得余下的数字按原次序组成的新数最大,比如当n=92081346718538,m=10时,则新的最大数是9888
输入
第一行输入一个正整数T,表示有T组测试数据
每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数)
输出
每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数
样例输入
2 92081346718538 10 1008908 5
样例输出
9888 98
贪心算法:每一次寻找局部最优,最后使达到全局最优。
这道题贪心算法体现很明显,故记录之。
思路:
首先要明白,在一串数中,我们如果要去掉之中n位后还剩m位,那么剩余的最大数的最高位的位置就不可能在倒数的第(m-1)位到最后一位里面,不然就凑不齐m位整数,与题意矛盾了。
按这个思路,我们寻找剩余m位中的某一位时,都像第一步那样单独考虑。并且,寻找的起始位置不再是0位,而是上一次找到的最大值的下一个位置开始寻找。
题目要求顺序输出,一种方案是找到了就直接输出,另一种方案用临时数组做标记。
代码如下:
#include<stdio.h> #include<string.h> int main() { int t; scanf("%d",&t); while(t--) { char n[100]; int m,i,j,max=0,maxj=-1; scanf("%s%d",n,&m); for(i=0;i<(strlen(n)-m);i++) { max=0; for(j=maxj+1;j<=(m+i);j++) { if(n[j]>max) { max=n[j]; maxj=j; } } printf("%c",n[maxj]); } printf("\n"); } }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言判断一个数是否是2的幂次方或4的幂次方
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- C语言实现选择排序、冒泡排序和快速排序的代码示例