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

【题解】最小新整数

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

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;
}


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

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

标签: 贪心
分享给朋友:

相关文章

【题解】山区建小学

【题目描述】政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往。已知任意两个相邻的村庄之间的距离为di(为正整数),其中,0<i<...

【题解】跳格子2

【题目描述】地面上有一排长度为n的格子1-n,每个格子上都有一个数xi,开始时你在位置0,每次你可以向前跳1-2格,然后取走格子上的数,直到跳到位置n+1。取走的数的和就是你的得分,现在你想知道你可能...

【题解】计算天数

【题目描述】以 年-月-日 的形式给定一个日期,计算给定的日期是当年第几天。注意闰年二月有29天。【输入描述】输入格式为 yyyy-mm-dd,其中yyyy 表...

【题解】月度开销

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

【题解】求最长不下降序列

【题目描述】设有由n(1≤n≤200)个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)且b(i)≠b(j)(i≠j),若存在i1<i2<i3<…<ie 且有b...

【题解】切割绳子

【题目描述】有N条绳子,它们的长度分别为Li。如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2位后的小数)。【输入描述】第一行两个整数N和K(0&l...