首页 > 试题广场 >

最大正整数

[编程题]最大正整数
  • 热度指数:527 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
数组中存储了一堆小于10的非负整数,整个数组从左到右代表一个正整数(如数组[0, 1, 3, 2]代表正整数132)。现给出一个正整数K,要求经过K次数组相邻位置元素交换(必须完成K次交换),使得这个数组代表的数字最大。
例如, 
int array[] = {0, 1, 3, 2}, K = 1,则经过1次交换后,数组所能代表的最大值为1032;
int array[] = {0, 1, 3, 2}, K = 2,则经过2次交换后,数组所能代表的最大值为3012。

输入描述:
首先,输入一个正整数T,表示接收T组测试用例;
此后,输入T组测试用例,其中每组测试用例包含如下内容:
输入1:一个正整数K,表示在当前测试用例中,可以对数组进行K次相邻元素间的位置交换;
输入2:一个正整数N,表示当前用例包含数组的长度;
输入3:N个数组元素,所有元素都是小于10的非负整数;


输出描述:
输出共N行,对应于N个用例的输出:
每行输出为一个数组,数组元素之间用一个空格隔开,要求每行输出前后均无多余空格。
示例1

输入

4
2
5
4 2 1 3 5
3
5
4 2 1 3 5
4
5
4 2 1 3 5
5
5
4 2 1 3 5

输出

4 3 2 1 5
4 5 2 1 3
5 4 2 1 3
5 4 2 3 1

备注:
60%的数据 
70%的数据 
80%的数据 
90%的数据 
100%的数据 
100%的数据 ,60%的数据 ,100%的数据 
import sys
def cout(num):
    print(' '.join([str(val) for val in num]))
    
n=map(int,sys.stdin.readline().split())[0]
for _ in range(n):
    k=map(int,sys.stdin.readline().split())[0]
    length=map(int,sys.stdin.readline().split())[0]
    nums=list(map(int,sys.stdin.readline().split()))
    res=[]
    if length==1:
        print(nums[0])
        continue
    if k==0:
        cout(nums)
        continue
    while k>0 and len(nums)>0:
        if len(nums)+1>k:
            cur=max(nums[:k+1])
        else:
            cur=max(nums)
        i=nums.index(cur)
        if i!=0:
            if i<len(nums)-1:
                nums=[nums[i]]+nums[:i]+nums[i+1:]
            else:
                nums=[nums[i]]+nums[:i]
            k-=i
            res.append(cur)
            nums.pop(0)
        else:
            res.append(cur)
            nums.pop(0)
    res+=nums
    if k>0 and k%2==1:
        tmp=res[-1]
        res[-1]=res[-2]
        res[-2]=tmp
    cout(res)
    

老是超时怎么搞啊

思路就是从前往后,以当前位置为起点得到长度为k+1的窗口,判断最大值是否在开头,交换后保持其余顺序不变,k-i。最后由于不能浪费k,所以k为奇数就交换最后两位,否则不管
编辑于 2021-04-04 22:17:05 回复(0)