当前位置:首页 > 题解目录 > 正文内容

【题解】最小新整数

亿万年的星光4年前 (2021-05-01)题解目录2436

4.最小新整数(smallest.cpp)


【题目描述】

假如:有一个十进制正整数n,每个数位上数字均不为0,并且0<n<1000000000。n的位数为m。先在从m位中删除k位(0<k<m),求生成的新整数最小为多少?

如:n=9128456,k=2,则生成的新整数最小为12456。

【输入描述】

第一行t,表示有t组数据;

接下来t行,每一行表示一组测试数据,每组测试数据包含两个数字n,k。

【输出描述】

t行,每行一个数字,表示从n行中删除k位后得到的最小整数。

【样例输入】

2
9128456 2
1444 3


【样例输出】

12456
1

【题目分析】

  • 贪心算法中的字典序类问题

  • 要整数最小,那么最高位要最小,次高位要在此基础上再最小……因此,我们可以先确定最高位的数,在确定次高位的,这样一直下去,知道整个数确定为止。

  • 一个数字有n位,删除m位,也就是保留n-m位。



【参考代码1】

#include<bits/stdc++.h>
using namespace std;
int main() {
	int i, n, len, t;
	char a[105];
	int cnt;
	cin>>cnt;
	while(cnt--) {
		cin>>a>>n;
		t = n;
		len = strlen(a);
		if(len <= t) { //要删除的数量大于总长度,直接为0
			printf("0\n");
			continue;//及时跳出
		}
		while(n--) {
			i = 0;
			while(a[i] <= a[i + 1]) { //由左到右找到第一个最大的数(所在分位最大)
				i++;
			}
			for(; i < len; i++) { //删除此(相比较的最大分位)最大值
				a[i] = a[i + 1];
			}
			len--;
		}
		printf("%s\n", a);
	}
	return 0;
}


【参考代码2】

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char str[100];
int main()
{
    int t,n;
    cin>>t;
    while(t--)
    {
        cin>>str>>n;
        int len=strlen(str);
        while(n--)
        {
            for(int i=0;i<len-1;i++)
                if(str[i]>str[i+1])
                {
                    for(int j=i;j<len-1;j++)
                        str[j]=str[j+1];
                    break;
                }
            len--;
        }
        str[len]='\0';
        cout<<str<<endl;
    }
    return 0;
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

标签: 贪心
分享给朋友:

相关文章

【题解】游戏

【题目描述】上了半天的物理数学课,大家的脑子有点转不动了,下午的课表似乎看透了同学们的 心思,第一节就安排了体育课,CZ 中学的课表真是太有爱了,赞一个!午间休息后,文体 委员小 S 喊大家到教室外的...

绝对素数

【题目描述】如果一个自然数是素数,且它的数字位置经过对换后仍为素数,则称为绝对素数,例如13。试求出所有二位绝对素数。【输入描述】无【输出描述】所有二位绝对素数(由小到大,一个数一行)。【输入样例】无...

【题解】月度开销

【题目描述】农夫约翰是一个精明的会计师。他意识到自己可能没有足够的钱来维持农场的运转了。他计算出并记录下了接下来N(1 ≤N≤ 100,000) 天里每天需要的开销。约翰打算为连续的M(1 ≤M≤N)...

【题解】智力大冲浪

【题目描述】小伟报名参加中央电视台的智力大冲浪节目。本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元。先不要太高兴!因为这些钱还不一定都是你的。接下来主持人宣布了比赛规则:首...

【题解】人民币问题

【题目描述】给出任意的人民币(>10 元)的整币兑换成 5 元、2 元和 1 元币值(要求三种币值均有)的方法有多少种。【输入描述】输入任意的人民币(>10 元)的整币 100,50,20...

哥德巴赫猜想

【题目描述】哥德巴赫猜想的命题之一是:大于6 的偶数等于两个素数之和。编程将6~100所有偶数表示成两个素数之和。【输入描述】无【输出描述】分行输出例如:6=3+38=3+5…(每个数只拆开一次,请保...