删数问题(典型的贪心算法问题)
题目:
键盘输入一个高精度的正整数n(<=240位),
去掉任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。
编程对给定的n和s,寻找一种方案,使得剩下的数最小。
Simple Input
178543
4
Simple Output
13
思路:
每一步总是选择一个使剩下的数最小的数字删除,即按高位到低位的顺序搜索,若各位数字递增,则删除最后一个数字;否则删除第一个递减区间的首字符,这样删一位便形成了一个新的数字串。然后回到串首,按上述规则再删除下一个数字
参考借鉴代码1如下:
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int main() 5 { 6 string n; 7 int s,i,x,l,m; 8 while(cin>>n>>s) 9 { 10 i=-1,m=0,x=0; 11 l=n.length(); 12 while(x<s&&m==0) 13 { 14 i++; 15 if(n[i]>n[i+1])//出现递减,删除递减的首数字 16 { 17 n=n.erase(i,1); 18 x++;// x统计删除数字的个数 19 i=-1;//从头开始查递减区间 20 } 21 if(i==l-x-2&&x<s) 22 m=1;//已经无递减区间,m=1脱离循环 23 } 24 cout<<n.substr(0,l-s+x)<<endl;//只打印剩下的左边l-(s-x)个数字 25 } 26 return 0; 27 }
参考借鉴代码2如下:
1 #include<stdio.h> 2 int main() 3 { 4 int i,n,num,tail,head; 5 char q[100],s[100]; 6 while(~scanf("%s%d",s,&n)){ 7 tail=head=num=i=0; 8 q[tail++]=s[i++]; 9 while(s[i]){ 10 if(s[i]>q[tail-1]||num>=n) 11 q[tail++]=s[i++]; 12 else{ 13 if(head==tail){ 14 q[tail++]=s[i++]; 15 }else{ 16 tail--; 17 num++; 18 } 19 } 20 } 21 q[tail]=0; 22 puts(q); 23 } 24 return 0; 25 }
posted on 2012-08-23 11:58 mycapple 阅读(21243) 评论(2) 编辑 收藏 举报