NOYJ——寻找最大数
2018-06-17 23:44:27来源:未知 阅读 ()
1)题目:寻找最大数
请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大,比如当n=92081346718538,m=10时,则新的最大数是9888输入第一行输入一个正整数T,表示有T组测试数据
输入
每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数)
输出
每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数
样例输入
2
92081346718538 10
1008908 5
样例输出
9888 98
2)算法分析:
题目中明确的指出了要删除一部分数,使得剩下的数最大,那么我们同样可以将思路反转,我们来选取最大的数,使之构成s最大的数。就像样例中m=10;我们就可以选取strlen(s)-m个数字来构成我们所需要的数。首先我们将数字以字符串的形式来存储。其次,我们需要选择最高位的数字,但是题目中的要求是在原数上删除,所以我们不可以打乱原数字各个位的顺序,所以第一个数字我们只能从s[0]到s[m]中查找最大数,然后从最大数字之后的一位到s[m+1]中查找第二位,直至找到最后一位。在这个过程中我们必须要保证还有足够的数字来供我们选择,因为不管什么,数位多的肯定要比数位少的大。
3)源代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
int ncase;
char s[110], ans[110];
int m, len, sign, max, num;
scanf("%d", &ncase);
while(ncase--)
{
num = sign = 0;
scanf("%s%d", s, &m);
len = strlen(s);
for(int i = 0; i < len - m; ++i) //找m次最大值
{
max = -1;
for(int j = sign; j <= m + i; ++j) //j的范围不能错~保证位数
{
if(max < s[j] - '0')
{
max = s[j] - '0';
sign = j;
}
}
ans[num++] = s[sign++];
}
for(int i = 0; i < len - m; ++i)
cout<<ans[i] - '0';
cout<<endl;
}
return 0;
}
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:第十八章 ActiveX控件
下一篇:棋盘覆盖(分治法)
- 寻找两个有序数组的中位数 2020-04-09
- [JSOI2008][BZOJ1012] 最大数(动态开点线段树) 2018-06-17
- Codevs 1860 最大数 2018-06-17
- 二分搜索 2018-06-17
- 1860 最大数 2018-06-17
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash