博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NYOJ1057:寻找最大数(三)
阅读量:5829 次
发布时间:2019-06-18

本文共 1617 字,大约阅读时间需要 5 分钟。

寻找最大数(三)

时间限制:
1000 ms  |  内存限制:
65535 KB
难度:
2
描述

给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数。

求这个新的整数的最大值是多少。

输入
多组测试数据。
每组测试数据占一行,每行有两个数N和K (1 ≤ N≤ 10^18; 0 ≤ K ≤ 100).
输出
每组测试数据的输出占一行,输出移动后得到的新的整数的最大值。
样例输入
1990 1100 09090000078001234 6
样例输出
91901009907000008001234
题解:

比如N=1234  k=3,head(数组下标)初始值为0,先找出[ a[head] , a[head+3] ]中的最大值,若该最大值不为a[head],将该最大值交换到head处,此时k=0结束,最大值为4123; 

再比如N=1234 k=5,head(数组下标)初始值为0,先找出[ a[head] , a[head+3] ](因为a[head+5]超出了数组,将其改为数组最后一位元素)中的最大值,若该最大值不为a[head],将该最大值交换到head处,此时k=2,head=1,找出[ a[head] , a[head+2] ] (要判断a[head+2]有无超出数组,有则判断至数组最后一位即可)最大值,若该最大值不为a[head],将该最大值交换到head处,此时k=0,退出,结果为4312。

# include 
# include
int main(){ int pos, len, temp, imax, head, tail, i, j, n; char s[20]; while(scanf("%s%d",&s,&n) != EOF) { imax = head = 0; len = strlen(s); while(1) { imax = 0; if(!n || head==len) break; tail = head+n; if(tail >= len) tail = len-1; for(i=tail; i>=head; --i)//寻找head到tail的最大值位置,若不在head处,将最大值交换到head处。 { if(s[i]>=imax) { pos = i; imax = s[i]; } } if(pos != head) { temp = s[pos]; for(j=pos; j>head; --j) { s[j] = s[j-1]; --n; } s[head] = temp; } ++head; } printf("%s\n",s); } return 0;}

转载于:https://www.cnblogs.com/junior19/p/6730105.html

你可能感兴趣的文章
MyEclipse 快捷键
查看>>
快速傅里叶变换FFT
查看>>
大数据常用基本算法
查看>>
JavaScript学习笔记(十三)——生成器(generator)
查看>>
hibernate保存失败
查看>>
MySQL增量订阅&消费组件Canal POC
查看>>
Sqlite多线程
查看>>
数据结构-时间复杂度
查看>>
对象与字符串相互转换
查看>>
[NOIp2017提高组]小凯的疑惑
查看>>
《C程序设计语言》练习1-5
查看>>
$\frac{dy}{dx}$ 是什么意思?
查看>>
Go开发之路(目录)
查看>>
RHEL6.5安装成功ORACLE11GR2之后,编写PROC程序出错解决方法
查看>>
(50)与magento集成
查看>>
Ubuntu设置python3为默认版本
查看>>
JsonCpp 的使用
查看>>
问题账户需求分析
查看>>
JavaSE-代码块
查看>>
爬取所有校园新闻
查看>>