寻找最大数
来源:互联网 发布:家用网络交换机的作用 编辑:程序博客网 时间:2024/06/05 17:20
描述
请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大,
比如当n=92081346718538,m=10时,则新的最大数是9888
输入
第一行输入一个正整数T,表示有T组测试数据
每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数)
输出
每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数
样例输入
2
92081346718538 10
1008908 5
样例输出
9888
98
思路:题目中明确的指出了要删除一部分数,使得剩下的数最大,那么我们同样可以将思路反转,我们来选取最大的数,使之构成s最大的数。就像样例中m=10;我们就可以选取strlen(s)-m个数字来构成我们所需要的数。首先我们将数字以字符串的形式来存储。其次,我们需要选择最高位的数字,但是题目中的要求是在原数上删除,所以我们不可以打乱原数字各个位的顺序,所以第一个数字我们只能从s[0]到s[m]中查找最大数,然后从最大数字之后的一位到s[m+1]中查找第二位,直至找到最后一位。在这个过程中我们必须要保证还有足够的数字来供我们选择,因为不管什么,数位多的肯定要比数位少的大。
#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
using namespace std;
int main()
{
char s[150],h[150];//定义数组s用来存放输入的最大数,h用来放每次找到的局部最优解
int a,b,c,d,i,j,max,count;
cin>>a;
while(a--)
{
scanf("%s%d",&s,&b);
c=strlen(s);//测字符数组的长度
d=0;//记录每次找到的局部最大数字的下标
count=0;
for(i=0;i<c-b;i++)//找c-b次最大值
{
max=-1;//让每次寻找的局部最大值为-1
for(j=d;j<=b+i;j++)//选好j的范围
{
if(max<s[j])
{
max=s[j];
d=j;
}
}
h[count++]=s[d];
d+=1;//选好s[d]为第一位,选第二位数的时候是从s[d+1]位开始到b+i位
}
for(i=0;i<c-b;i++)
{
cout<<h[i];
}
cout<<endl;
}
return 0;
}
- 寻找最大数 nyist448
- acm-寻找最大数
- NYOJ 寻找最大数
- 寻找最大数
- nyoj448寻找最大数
- 寻找最大数
- 448 寻找最大数
- nyoj448 寻找最大数
- 寻找最大数
- nyoj448寻找最大数
- nyoj448--寻找最大数
- 寻找最大数
- NYOJ448寻找最大数
- 寻找最大数
- 寻找最大数
- NYOJ 寻找最大数
- 寻找最大数
- 寻找最大数--贪心
- JAVA中不同集合的理解
- N皇后问题
- Unity JsonToDic
- 1.#QNAN、1.#IND和1.#INF等“无效”浮点数说明及其判断
- JSON介绍
- 寻找最大数
- Smack jar包介绍
- libevent例子:time-test.c
- 新员工入职详细培训计划
- H
- cout.setf(ios_base::fixed,ios_base::floatfield);
- spring Cache 配置和调用过程
- ajax提交表单后,页面仍被刷新
- 《简约至上 交互式设计四策略》