2015 湘潭大学程序设计比赛(Internet)Problem D:最小的数

今天的比赛,因为时间问题,我就做了这一个题

题目描述

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

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

输入

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

输出

最终能得到的最小的数。

样例输入

2
321654987 1
321654987 2

样例输出

231654987 

132654987

这个题没有什么算法,就是用俩嵌套for循环,然后要注意一下边界条件就能A,比赛的时候WA了好几次,要么是忘了memset,要么ct忘了重置为0,要么就是j写成i,总之非常egg pain,犯了好多低级错误,不在状态啊。

我解释一下我的代码和思路把。

我这个类似于贪心算法,就是每次都把整个数列扫描一遍,用num[0~9]标记出0~9这10个数第一次出现的位置,然后从0开始往9for循环,如果最小的数的位置与当前要确定的位置距离小于等于k,那么就可以把这个数组挨个往后挪,然后把那个小的数放到当前操作的位置,k-=操作的距离。

我的代码还有好多需要完善的地方,能降低复杂度,但是比赛的时候比较匆忙,没顾上考虑这么多,能a就行。下面是我比赛的源代码。其实现在看有好多能剪枝的地方,如果这个算法超时,再改(我当时是这样想的)。

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <stack>
using namespace std;
typedef long long LL;
const int INF=0x7fffffff;
const int MAX_N=1009;
int T,k,ct;
char A[MAX_N];
int num[10];
int main(){
    cin>>T;
    while(T--){
        memset(A,0,sizeof(A));
        scanf("%s",A);
        scanf("%d",&k);
        int len=strlen(A);

        memset(num,-1,sizeof(num));
        ct=0;
        for(int i=1;i<len;i++){
            if(num[A[i]-‘0‘]==-1){//这里也可以降复杂度,因为只要算小于A[0]的就行
                num[A[i]-‘0‘]=i;
                ct++;
            }
            if(ct==10)break;
        }
        for(int i=1;i<=9;i++){//这个地方可以把9改成A[0]-‘0‘
            if(num[i]<=k&&num[i]!=-1&&i<A[0]-‘0‘){
                char cur=A[num[i]];
                for(int j=num[i];j>=1;j--){
                    A[j]=A[j-1];
                }
                A[0]=cur;
                k-=num[i];
                break;
            }
        }

        for(int i=1;i<len;i++){
            if(k==0)break;
            memset(num,-1,sizeof(num));
            ct=0;
            for(int j=i+1;j<len;j++){
                if(num[A[j]-‘0‘]==-1){
                    num[A[j]-‘0‘]=j;
                    ct++;
                }
                if(ct==10)break;
            }
            for(int j=0;j<=9;j++){
                if(num[j]-i<=k&&num[j]!=-1&&j<A[i]-‘0‘){
                    char cur=A[num[j]];
                    for(int p=num[j];p>i;p--){
                        A[p]=A[p-1];
                    }
                    A[i]=cur;
                    k-=num[j]-i;
                    break;
                }
            }
        }

        cout<<A<<endl;
    }
    return 0;
}
时间: 2024-11-10 18:56:10

2015 湘潭大学程序设计比赛(Internet)Problem D:最小的数的相关文章

2015 湘潭大学程序设计比赛(Internet)--D题-最小的数

最小的数 Accepted : 47   Submit : 276 Time Limit : 1000 MS   Memory Limit : 65536 KB 题目描述 给你一个n位数,每次操作可以选该数任意的相邻两位进行交换,如果最多可以操作k次,那么最终可以得到的最小的数是什么 (n位且不能含前导零)? 输入 有多组测试数据,第一行为数据个数T(T<=10); 每组数据占一行,包含一个数(不超过1000位)和k(0<=k<=1000),中间用空格隔开; 输出 最终能得到的最小的数.

2015 湘潭大学程序设计比赛(Internet) 全解析 + AC代码

一到搜索卡死人... 1. 两个变量记录等级和经验值就好. int main(){ int T; scanf("%d",&T); while(T--){ int n,l; int jy=0; int sum = 0; scanf("%d%d",&n,&l); for(int i = 0;i<n;i++){ int t; scanf("%d",&t); if(l<t) continue; jy += 10

2015 湘潭大学程序设计比赛(Internet)--E题--烦人的异或

烦人的异或 Accepted : 27   Submit : 102 Time Limit : 5000 MS   Memory Limit : 65536 KB 题目描述 如下图,有一N*M的表格,每个格子有一个数字.我们定义主矩形为给出的一对坐标所确定的矩形(该对坐标总是某个矩形的对顶点坐标对).它最多可产生4个副矩形, 均由主矩形的顶点和表格边界确定.我们需要的是所有阴影部分的数的异或值. 上图的x1=3,y1=3,x2=4,y2=4,所以答案就是a11^a12^a21^a22^a15^a

因为一个空格,就注定了结果——第五届山东省ACM程序设计比赛总结

应该来说这是一个很失败的结果,本届省赛铩羽而归.正如志愿者所说,打铁是一件很丢人的事情. 作为队长,完全没有想到会是这样的一次旅程.虽然因为去baidu的实习和各种offer的申请,对acm抱着能水就水绝不深究的敷衍态度.但之前着实还是参加了一些商业比赛,成绩都还可以,表面的繁盛更加放松了我的警惕.完全没有想到,正是线下赛的放松,使我线上赛的心态发生了重大的变化,并连锁反应了这一系列不理想的后果. 好多事情看起来完全是偶然因素,但是偶然中往往蕴藏着一些必然. 热身赛和去年一样,第二题是纯粹试人品

HDU 5352 MZL&#39;s City(2015 多校 第5场,最小费用最大流)

  MZL's City Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 291    Accepted Submission(s): 94 Problem Description MZL is an active girl who has her own country. Her big country has N cities nu

2019年湘潭大学程序设计竞赛(重现赛)

2019年湘潭大学程序设计竞赛(重现赛) A:Who's better? #include<bits/stdc++.h> using namespace std; int main(){ int n1,p1,s1,n2,p2,s2; cin>>n1>>p1>>s1; cin>>n2>>p2>>s2; if(n1!=n2){ if(n1>n2)cout<<"1\n"; else cout

HDOJ3374 String Problem [KMP最小循环节点]+[最小(大)表示法]

String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1442    Accepted Submission(s): 645 Problem Description Give you a string with length N, you can generate N strings by left shifts

记第五届山东省ACM程序设计比赛——遗憾并非遗憾

记第五届山东省ACM程序设计比赛 5月10日上午9点半左右,我们的队伍从学校出发,一个多小时后到达本次比赛的地点-哈尔滨工业大学. 报道,领材料,吃午饭,在哈工大的校园里逛了逛,去主楼的自习室歇息了一会.然后參加下午两点到四点的热身赛.不得不吐槽一下热身赛的题目,第一个题题目的数据范围写的是十的六次方,我们写出来提交怎么也不正确,后来快结束时看讨论板,管理人员说数据范围是十的九次方,无语了.第二个题目无输入,仅仅输出1到20之间的一个随机整数,题目上也明白说了是拼人品的题目,有的队伍"人品比較好

记第五届山东省ACM程序设计比赛——遗憾并不是遗憾

记第五届山东省ACM程序设计比赛 5月10日上午9点半左右,我们的队伍从学校出发,一个多小时后到达本次比赛的地点-哈尔滨工业大学. 报道,领材料,吃午饭,在哈工大的校园里逛了逛,去主楼的自习室休息了一会.然后参加下午两点到四点的热身赛.不得不吐槽一下热身赛的题目,第一个题题目的数据范围写的是十的六次方,我们写出来提交怎么也不对,后来快结束时看讨论板,管理人员说数据范围是十的九次方,无语了.第二个题目无输入,只输出1到20之间的一个随机整数,题目上也明确说了是拼人品的题目,有的队伍"人品比较好&q