贪心算法例题:2072删数问题

来源:互联网 发布:网络犯罪的危害 编辑:程序博客网 时间:2024/05/29 18:14

  1. /* 
  2. 题目描述: 
  3.     键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。编程对给定的n与s,寻找一种方案,使得剩下的数字组成的新数最小。 
  4.      
  5. 输入: 
  6.     输入有多组 每组包括原始数n,要去掉的数字数s 
  7. 输出: 
  8.     输出去掉s个数后最小的数 
  9.      
  10. 示例输入 
  11. 178543  4 
  12. 示例输出 
  13. 13 
  14. */  

思路:
每一步总是选择一个使剩下的数最小的数字删除,即按高位到低位的顺序搜索,若各位数字递增,则删除最后一个数字;否则删除第一个递减区间的首字符,这样删一位便形成了一个新的数字串。然后回到串首,按上述规则再删除下一个数字。

注意前导0的处理!!!比如10005 3 答案应该是0。2001 1答案应该是1。

[cpp] view plain copy
  1. #include <stdio.h>  
  2. #include <string.h>  
  3. int main()  
  4. {  
  5.     char a[105];  
  6.     int n,i,j,t,len;  
  7.     while(scanf("%s %d",a,&n)!=EOF)  
  8.     {  
  9.         len=strlen(a);  
  10.         t=n;  
  11.         if(n>=len)  
  12.         {  
  13.             printf("0\n");  
  14.             continue;  
  15.         }  
  16.         while(n>0)  
  17.         {  
  18.             i=0;  
  19.             while(i<len&&a[i]<=a[i+1])  
  20.                 i++;  
  21.             for(j=i;j<len;j++)  
  22.                 a[j]=a[j+1];  
  23.             n--;  
  24.         }  
  25.         i=0;  
  26.         if(a[0]=='0')  
  27.         {  
  28.             while(a[i]=='0')  
  29.                 i++;  
  30.         }  
  31.         if(i==len-t)  
  32.             printf("0");  
  33.         for(j=i;j<len-t;j++)  
  34.             printf("%c",a[j]);  
  35.         printf("\n");  
  36.     }  
  37.     return 0;  
  38. }   
转载自用户:ViolentLittleAngel