删数问题(典型的贪心算法问题)
2012-08-23 11:58
267 查看
题目:
键盘输入一个高精度的正整数n(<=240位),
去掉任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。
编程对给定的n和s,寻找一种方案,使得剩下的数最小。
Simple Input
178543
4
Simple Output
13
思路:
每一步总是选择一个使剩下的数最小的数字删除,即按高位到低位的顺序搜索,若各位数字递增,则删除最后一个数字;否则删除第一个递减区间的首字符,这样删一位便形成了一个新的数字串。然后回到串首,按上述规则再删除下一个数字
参考借鉴代码1如下:
参考借鉴代码2如下:
键盘输入一个高精度的正整数n(<=240位),
去掉任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。
编程对给定的n和s,寻找一种方案,使得剩下的数最小。
Simple Input
178543
4
Simple Output
13
思路:
每一步总是选择一个使剩下的数最小的数字删除,即按高位到低位的顺序搜索,若各位数字递增,则删除最后一个数字;否则删除第一个递减区间的首字符,这样删一位便形成了一个新的数字串。然后回到串首,按上述规则再删除下一个数字
参考借鉴代码1如下:
#include<iostream> #include<string> using namespace std; int main() { string n; int s,i,x,l,m; while(cin>>n>>s) { i=-1,m=0,x=0; l=n.length(); while(x<s&&m==0) { i++; if(n[i]>n[i+1])//出现递减,删除递减的首数字 { n=n.erase(i,1); x++;// x统计删除数字的个数 i=-1;//从头开始查递减区间 } if(i==l-x-2&&x<s) m=1;//已经无递减区间,m=1脱离循环 } cout<<n.substr(0,l-s+x)<<endl;//只打印剩下的左边l-(s-x)个数字 } return 0; }
参考借鉴代码2如下:
#include<stdio.h> int main() { int i,n,num,tail,head; char q[100],s[100]; while(~scanf("%s%d",s,&n)){ tail=head=num=i=0; q[tail++]=s[i++]; while(s[i]){ if(s[i]>q[tail-1]||num>=n) q[tail++]=s[i++]; else{ if(head==tail){ q[tail++]=s[i++]; }else{ tail--; num++; } } } q[tail]=0; puts(q); } return 0; }
相关文章推荐
- 删数问题(典型的贪心算法问题)
- 贪心算法——区间找点问题
- 贪心算法求解背包问题
- 贪心算法之背包问题
- 贪心算法_活动安排问题
- 算法竞赛入门经典:第八章 高效算法设计 8.16贪心之乘船问题
- 贪心算法之活动选择问题
- 贪心算法--活动选择问题
- 贪心算法之区间图着色问题
- 贪心算法求解问题的选择准则
- 贪心算法解决最少圆覆盖最多点问题
- 【算法导论实验5】贪心-活动安排问题与背包问题
- 贪心算法-活动安排问题
- java代码实现贪心算法删除数字问题
- 贪心算法之背包问题
- 贪心算法——区间找点问题
- 贪心算法——最优装载问题
- 算法题:输油管道问题 - 贪心
- ACM_程序设计竞赛:贪心算法:区间问题
- 贪心算法(二)——一般背包问题