删数字nyoj448

来源:互联网 发布:sem与seo的区别 编辑:程序博客网 时间:2024/06/17 09:24

请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大,

比如当n=92081346718538,m=10时,则新的最大数是9888

 

输入
第一行输入一个正整数T,表示有T组测试数据
每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数)
输出
每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数
样例输入
292081346718538 101008908 5
样例输出
988898
//典型的贪心,本题其实有两个思路,第一个是每一次删除左边比右边小的数,如果均是下降序列,那么就删除最后一个数//另一个思路是倒过来想,即是找到剩下的数最大,即n个数,删除m个,就是找n-m个数最大,注意每一次找的范围#include <stdio.h>#include <string.h>  int main()  {      int i,j,m,n,T,l,ok;      char s1[105];      scanf("%d",&T);      while(T--)      {         scanf("%s",s1);         scanf("%d",&n);         l=strlen(s1);         while(n--)         {             ok=0;         for (i=0;i<l-1;i++)          {              if (s1[i]<s1[i+1])//如果该位上的数比它的下一位小              {               ok=1;               break;              }          }//如果找的到左边比右边小的数          if (!ok)              i=l-1;//如果都是递减序列,那就删除右边最小的数           for (j=i;j<l-1;j++)           s1[j]=s1[j+1];//删除第i位上的数           l--;         }         for (i=0;i<l;i++)       printf("%c",s1[i]);       printf("\n");      }      return 0;    }

#include <stdio.h>#include <string.h> int main() {     int i,j,m,T,l,sign,num,max;     char s[105];     int s1[105];     scanf("%d",&T);     while(T--)     {         num=0;         memset(s1,0,sizeof(s1));         scanf("%s",s);         scanf("%d",&m);         l=strlen(s);         sign=0;         for (i=1;i<=l-m;i++)//第一次加入元素         {             max=-1;             for (j=sign;j<m+i;j++)//为什么是m+i,因为每一次应该剩下l-m-i个数,比如原先(没开始拿数)应该至少有l-m个数,而每一次删选都能从前面一个得到一个数,那么后面的压力就可以少一个,再拿总位数去减(注意这里是下标,即总位数-1去减至少应保留的位数))             if (s[j]>max)             {                max=s[j];                sign=j+1;             }                s1[num++]=max-'0';         }         for (i=0;i<num;i++)            printf("%d",s1[i]);            printf("\n");         }         return 0; }


0 0
原创粉丝点击