删数问题
来源:互联网 发布:我想在淘宝上卖东西该怎么办 编辑:程序博客网 时间:2024/06/03 18:18
删数问题
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic
Problem Description
键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。编程对给定的n与s,寻找一种方案,使得剩下的数字组成的新数最小。
Input
输入有多组 每组包括原始数n,要去掉的数字数s;
Output
输出去掉s个数后最小的数
Example Input
178543 4
Example Output
13
Hint
Author
题解:采用贪心的策略来做。首先确定贪心方案,容易发现每次去掉最大的数不能得到理想的结果,可以发现当出现递减区间时去掉它的首位可以得到最小值。
在这个过程中要注意的是0的存在,比如输入为10086删除2个数,第一步是删掉1,第二步是删掉8,则剩余为006,在这种情况下0是无效的。
因为正整数n位数太多,long long int也存不下,所以使用字符串读入。
下面是完整代码:
#include<bits/stdc++.h>using namespace std;int main(){ char a[105]; int s, len, i, n; while(~scanf("%s %d", a, &s))//输入正整数,将其存入字符串 { while(s--)//进行删数 { i = 0; len = strlen(a); while(a[i] <= a[i+1])//遇到第一个递减区间停下,即第一个比前一个大的数 { i++; } for(; i < len; i++)//注意去掉的是递减区间的首位 { a[i] = a[i+1]; } } i = 0; n = 0; while(a[i] == '0' && a[i] <= a[i+1])//找出0的个数 {n++;i++;} len = strlen(a); if(n == len) printf("0\n"); else { for(i = n; i < len; i++) { printf("%c", a[i]); } printf("\n"); } } return 0;}
个人对这个贪心方案原理的理解:
可以发现,位数相同时,升序排列的最小,降序排列的最大。比如123和321,相同的数字以及位数时,123最小,321最大,所以我们要得到相同位数最小的数时,就要将其尽可能排成升序。假如已经是升序了,但删除的数的个数还没有达到要求的s,则最后一位和'\0'比较,则最后一位一定大于'\0',所以程序会认为最后一位是递减区间的首位,进而删除。
0 0
- 删数问题
- 删数问题
- 1298 删数问题
- 删数问题
- 【贪心】删数问题
- 【贪心】删数问题
- 删数问题 队内赛
- 删数问题
- 删数问题
- 8605 删数问题
- 删数问题
- 删数问题
- 删数问题
- 删数问题
- 删数问题
- 删数问题
- sdut2072 删数问题
- 删数问题
- 第二部分 自动内存管理机制
- Spring学习-29:Spring中的事务管理之事务开发常用API的详解
- Xcode清理缓存和垃圾文件
- JSP (java server page) servlet生命周期
- Win10 将开启“游戏模式”
- 删数问题
- win7 装固态升级win10 心得
- JS性能优化之创建文档碎片(document.createDocumentFragment)
- 185
- PHP性能测试工具xhprof的安装和使用
- 关于 排序 两三事
- Java 中的Synchronized解析
- enum
- 广义表 头尾表示法表示