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;
}
}
相关文章推荐
- 第五届计算机职业资格认证考试CCF (第二题)
- Android Studio下Android应用开发集成百度语音合成使用方法样例
- Nginx深入详解之多进程网络模型
- CSS样式_链接&列表
- 【后缀自动机】【SAM】【自动机】【数据结构】后缀自动机理解(入门)
- iOS 常用数学公式
- 临时设施的盖顶一律使用石棉瓦。 X
- 【SDOI2016Round1】游记
- 回溯法
- 前端性能优化--如何让用户体验快速删除dom节点
- 用ajax实现三级联动
- 2B创业的中国式难题-【中国IC微专栏】2016.4.5
- DotNet 资源大全
- ABP框架搭建项目系列教程基础版
- Uva816 Abbott的复仇
- <string> 与<string.h>、<cstring>的区别
- 读书笔记--《高效能程序员的修炼》
- 读书笔记--《高效能程序员的修炼》
- <string> 与<string.h>、<cstring>的区别
- Swift快速入门之分支与循环