zoukankan      html  css  js  c++  java
  • 2015 湘潭大学程序设计比赛(Internet)--D题-最小的数

    题目描述

    给你一个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;
    }

  • 相关阅读:
    centos7的变化(转)
    配置邮件报警功能(脚本方式)
    临时和永久关闭Selinux
    centos7.2安装apache比较简单,直接上代码
    zabbix--------配置邮件报警功能---服务器上配置---------
    初来驾到学java修饰符的使用
    面向对象小小理解
    出来驾到学java3
    出来驾到学java2
    初来驾到学JAVA
  • 原文地址:https://www.cnblogs.com/NaCl/p/9580225.html
Copyright © 2011-2022 走看看