nyoj 1057
来源:互联网 发布:淘宝第三层级交易额 编辑:程序博客网 时间:2024/06/14 04:28
寻找最大数(三)
时间限制:1000 ms | 内存限制:65535 KB
难度:2
- 描述
给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数。
求这个新的整数的最大值是多少。
- 输入
- 多组测试数据。
每组测试数据占一行,每行有两个数N和K (1 ≤ N≤ 10^18; 0 ≤ K ≤ 100). - 输出
- 每组测试数据的输出占一行,输出移动后得到的新的整数的最大值。
- 样例输入
1990 1100 09090000078001234 6
- 样例输出
9190100
9907000008001234
解题思路:从高位枚举到低位,假设到第i位,那么就要从i+1位找最大的数并且能够交换到第i位。。贪心思想。。
一直WA。。。还在找原因
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct node{char num;int id;}digit[20];int n,k;char str[20];bool vis[20];bool cmp(node a,node b){if(a.num != b.num)return a.num > b.num;return a.id < b.id;}void swap(char *str,int l,int r){char t = str[r];for(int i = r-1; i >= l; i--)str[i+1] = str[i];str[l] = t;}int main(){while(scanf("%s %d",str,&k)!=EOF){getchar();n = strlen(str);for(int i = 0; i < n; i++){digit[i].id = i;digit[i].num = str[i];}sort(digit,digit+n,cmp);memset(vis,false,sizeof(vis));for(int i = 0; i < n; i++) //从高位到低位尽可能找到最大的for(int j = 0; j < n; j++){int id = digit[j].id;if(id == i || vis[id]) {if(vis[id] == true) continue;vis[id] = true;break;}if(id - i <= k && id > i && str[i] < str[id]){k -= id - i;vis[id] = true;swap(str,i,id);break;}}printf("%s\n",str);}return 0;}
0 0
- nyoj 1057
- NYOJ
- NYOJ
- NYOJ
- NYOJ
- NYOJ
- NYOJ
- NYOJ
- NYOJ
- NYOJ
- NYOJ
- NYOJ
- NYOJ
- NYOJ
- nyoj
- NYOJ
- NYOJ
- NYOJ
- hdoj 2067小兔的棋盘
- 哈理工oJ 1211 火车上的人数【暴力枚举】
- 数组名和数组名取地址& 的区别
- Hadoop copyToLocalFile报空指针错误
- 挑战NPC
- nyoj 1057
- 编写应用程序消息
- LeetCode刷题 (Python) | 275. H-Index II
- The Java™ Tutorials — Concurrency :前言
- Linux查看端口占用情况和开启端口命令
- 非常好用的颜色吸取器PicPick
- [HTTP]HTTP协议的状态码
- 297. Serialize and Deserialize Binary Tree
- 大数定理与中心极限定理