• 2015 湘潭大学程序设计比赛(Internet)--D题-最小的数 2015-05-13 20:55 51人阅读 评论(0) 收藏


    题目描述

    给你一个n位数,每次操作可以选该数任意的相邻两位进行交换,如果最多可以操作k次,那么最终可以得到的最小的数是什么

    (n位且不能含前导零)?

    输入

    有多组测试数据,第一行为数据个数T(T<=10); 每组数据占一行,包含一个数(不超过1000位)和k(0<=k<=1000),中间用空格隔开;

    输出

    最终能得到的最小的数。

    样例输入

    2
    321654987 1
    321654987 2
    
    

    样例输出

    231654987
    132654987
    
    

    这种类型的题自己遇到几次了,但是都没写出来,今天想起来,想了想,其实这题就是贪心的做法,从一个数出发,找到后面比它小而且那个数要最小,并且两个的相对位置不超过。其实代码还是参考呢了别人的写的,觉得还可以。。。。

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    int main()
    {
     char s[1000];
     int m,t;
     scanf("%d",&t);
     getchar();
     while(t--)
     {
      
      scanf("%s %d",s,&m);
      int min,k;
      int n=strlen(s) ;
      for(int i=0;i<n;i++)
      {
          k=i;
       for(int j=i+1;j<=i+m&&j<n;j++)//设置j<=i+m就是让搜索范围不超过给出的操作数
       {
        if(i==0&&s[j]=='0')
        continue;
        if(s[j]<s[k])
         k=j;
       }
       if(i!=k)
       {
           char c=s[k];
        for(int j=k;j>=i;j--)//从后面到前面将数交换
        s[j]=s[j-1];
        s[i]=c; 
            m=m-(k-i);//记得减去一次的交换数
       }
      }
        printf("%s ",s);
     }
      return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    [网络流24题] 深海机器人问题
    [网络流24题] 数字梯形问题
    处理银行卡号的格式
    每天十点的倒计时
    HTML meta标签总结与属性使用介绍
    禁止的一些操作
    input输入大于0的小数和整数
    cf 1037D BFS
    cf 1051F 树+图
    cf 911F 树的直径+贪心
  • 原文地址:https://www.cnblogs.com/NaCl/p/4700603.html
Copyright © 2020-2023  润新知