C++ 之 贪心算法 ( 删数问题 )
来源:互联网 发布:java设置线程优先级 编辑:程序博客网 时间:2024/05/29 19:28
贪心算法 — 删数问题 :
键盘输入一个高精度的正整数n(n<=240位),去掉其中任意s个数字后剩下的数字按照原来的次序将组成一个新的正整数。编程对给定的n和s,寻求一种方案,使得剩下组成的新数最小。
Sample Input
178543 4
Sample Output
13
解析:
由于正整数n的有效位数最大可达240位,所以可以采用字符串类型来存储n。那么,应如何来确定该删除哪s位呢?是不是只要删掉最大的s个数字就可以了呢?
为了尽可能地逼近目标,我们选取的贪心策略为:每一步总是选择一个使剩下的数最小的数字删去,即按高位到低位的顺序搜索,若各位数字递增,则删除最后一个数字,否则删除第一个递减区间的首字符。然后回到串首,按上述规则再删除下一个数字。重复以上过程s次,剩下的数字串便是问题的解了。
代码大解析:
状态:AC
#include<bits/stdc++.h>using namespace std;int s;string n;int main(){ bool flag=0; cin>>n; int lenn=n.length(); scanf("%d",&s); for(int j=1;j<=s;j++) for(int i=0;i<n.length()-1;i++) { if(n[i+1]<n[i]||n[i]==n.length()-1) { n.erase(i,1);//在数组中删除这个数 break; } } bool F=false; for(int i=0;i<=n.length()-1;i++) { if(n[i]!='0' || i==n.length()-1) F=true;//等找到一个不为0的数后输出或者是最后一位数 if(F) printf("%c",n[i]); } printf("\n");}
其实,面对后面的输出,我们还可以用一种方法,如下:
#include<bits/stdc++.h>using namespace std;int s;string n;int main(){ bool flag=0; cin>>n; int lenn=n.length(); scanf("%d",&s); for(int j=1;j<=s;j++) for(int i=0;i<n.length()-1;i++) { if(n[i+1]<n[i]||n[i]==n.length()-1) { n.erase(i,1); break; } } while(n[0]=='0'&&n[1]) { n.erase(0,1); } for(int i=0;i<=n.length()-1;i++) printf("%c",n[i]); printf("\n");}
重点提出:
while(n[0]=='0'&&n[1]) { n.erase(0,1);//删除0 } for(int i=0;i<=n.length()-1;i++) printf("%c",n[i]); printf("\n");}
阅读全文
1 1
- 贪心算法之删数问题
- 贪心算法之删数问题
- C++贪心算法之删数问题
- C++ 之 贪心算法 ( 删数问题 )
- 贪心算法 - 删数问题
- 贪心算法-删数问题
- 贪心算法---删数问题
- 贪心算法,删数问题
- 贪心算法 - 删数问题
- 贪心之删数问题
- 算法:(贪心算法)--删数问题
- 问题 A: [贪心算法]删数问题
- C语言贪心算法之过河问题
- 贪心算法之装箱问题(c++)
- 贪心算法—删数问题
- 【贪心算法初学】删数问题
- OJ3RD 1181 删数问题 - 贪心算法
- 贪心算法例题:2072删数问题
- Manifest合并失败
- dll 导出的类遇到 error LNK2019 的解决方法
- 注意COCOS2DX中的Z缓冲,解决点选不了的问题
- C/C++ 多文件程序结构
- 2017/8/18
- C++ 之 贪心算法 ( 删数问题 )
- 单例模式
- 【Spring】DI的各种类型变量注入方法
- Gym
- centos7.0 caffe安装详解
- java运行helloworld
- Hbase学习笔记:Hbase与ZooKeeper组合应用及Hbase常用操作
- 关于docker remote api未授权访问漏洞的学习与研究
- Python数据分析练习:北京、广州PM2.5空气质量分析(2)