您的位置:首页 > 其它

NYOJ448.寻找最大数

2016-04-08 07:53 330 查看

448.寻找最大数

时间限制:1000 ms |
内存限制:65535 KB
难度:2
描述
请在整数 n 中删除m个数字,
使得余下的数字按原次序组成的新数最大,

比如当n=92081346718538,m=10时,则新的最大数是9888

输入

第一行输入一个正整数T,表示有T组测试数据

每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数)

输出

每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数

样例输入

2

92081346718538 10

1008908 5


样例输出

9888

98


/*

思路:

这道题可以理解为:在字符串中找出一个由strlen(str)-m个字符按顺序(不要求连续)拼成的最大数。

其实这是个不断贪心的过程,首先要在str[0]到str[m](包括str[m])找到第一个最大的数字

(注意哦,是第一个最大数字)作为最高位数(之所以要在0到m间找,

是因为至少要留出strlen(str)-m-1位放在最高位后面的低位),假设是str[k],

然后再从str[k+1]到str[m+1](因为此时已经选了1个,所以留出至少strlen(str)-m-2位放在第二位位后面的低位)

找到第一个最大的作为第二位数……一直到strlen(str)-m个数被确定完,

这样从最高位到最低位都是所能选择的最大值,所以得到的结果也将是最大值。

*/

#include<iostream>

#include<string>

using namespace std;

int main() {

intt;

cin>> t;

while(t--) {

string str;

int m;

cin >> str >> m;

int len = str.length();

int j = 0, pos[101] = {0}, pos1 = 0, pos2 = m;

while(pos2 < len) {

int max = 0;

for(int i = pos1; i <= pos2; i++) {

if(str[i] > max) {

max = str[i];

pos1 = i+1;

}

}

pos[j] = str[pos1-1];

j++;

pos2++;

}

for(int i = 0; i < len-m; i++)

cout << char(pos[i]);

cout << endl;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: