3528:最小新整数

描述

给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0。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
 1 #include<stdio.h>
 2 #include<string.h>
 3 int main()
 4 {
 5     char a[10];
 6     int b[11],len,i,t,k,p,q;
 7     scanf("%d",&t);
 8     while(t--)
 9     {
10         memset(b,-1,sizeof(b));
11         scanf("%s %d",a,&k);
12         len=strlen(a);
13         for(i=1;i<=len;i++)
14             b[i]=a[i-1]-‘0‘;
15         for(p=1;p<=k;p++)
16             for(i=1;i<=len;i++)
17             {
18                 if(i==len)
19                 {
20                     len--;
21                     break;
22                 }
23                 if(b[i]>b[i+1])
24                 {
25                     for(q=i;q<len;q++)
26                         b[q]=b[q+1];
27                     len--;
28                     break;
29                 }
30             }
31         for(i=1;i<=len;i++)
32             if(b[i]>0)
33                 printf("%d",b[i]);
34         printf("\n");
35     }
36     return 0;
37 }
 1 //这个程序栈溢出,仅供参考
 2 #include<stdio.h>
 3 #include<string.h>
 4 int b[11];
 5 int i,j,mi,min;
 6 void m(int s,int z,int k)
 7 {
 8     if(k==0)    return ;
 9     else
10     {
11         min=10;
12         for(i=s;i<=z;i++)
13             if(b[i]<min&&b[i]!=-1)
14             {
15                 mi=i;min=b[i];
16             }
17         if(mi-s<=k)
18         {
19             for(i=s;i<mi;i++)
20                 b[i]=-1;
21             m(mi+1,z,k-mi+s);
22         }
23         else
24             m(s,mi-1,k);
25     }
26 }
27 int main()
28 {
29     char a[10];
30     int k,la,t;
31     scanf("%d",&t);
32     while(t)
33     {
34         memset(b,-1,sizeof(b));
35         scanf("%s %d",a,&k);
36         la=strlen(a);
37         for(i=0;i<la;i++)
38             b[i+1]=a[i]-‘0‘;
39         m(1,la,k);
40         for(i=1;i<=la;i++)
41             if(b[i]!=-1)    printf("%d",b[i]);
42         printf("\n");
43         t--;
44     }
45 }
时间: 2024-10-18 03:17:26

3528:最小新整数的相关文章

4.6算法之贪心-3528:最小新整数

描述 给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0.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

4137:最小新整数

查看 提交 统计 提示 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0.n的位数为m.现在从m位中删除k位(0<k < m),求生成的新整数最小为多少?例如: n = 9128456, k = 2, 则生成的新整数最小为12456 输入 第一行t, 表示有t组数据:接下来t行,每一行表示一组测试数据,每组测试数据包含两个数字n, k. 输出 t行,每行一个数字,表示从n中

贪心 - bailian4137:最小新整数

题目链接 http://bailian.openjudge.cn/practice/4137/ 这个题目原本以为选出前k大的数删除就可以得到正确结果,但是这种策略是错的,举一个反例:52376 2,如果取出7 6,得到523,显然还有更小的数 236. 正确的贪心策略是从左到右每次选取一个比后一位大的数,删除,进行k次,如果所有数字是增序的,就删除最后一个数字. 解题代码 #include <cstdio> #include <cstring> char s[15]; int m;

寻找最小的整数

题目:给定一个无序的整数数组,怎么找到第一个大于0,并且不在此数组的整数.比如[1,2,0]返回3,[3,4,-1,1]返回2,[1, 5, 3, 4, 2]返回6,[100, 3, 2, 1, 6,8, 5]返回4.要求使用O(1)空间和O(n)时间 解答:不停的让a[i] =i  归位. #include <stdio.h> void Swap(int &a, int &b) { int c = a; a = b; b = c; } int FindFirstNumberN

1. MissingInteger 最小遗失整数 Find the minimal positive integer not occurring in a given sequence.

package com.code; import java.util.Arrays; public class Test04_1 { public static int solution(int[] A) { int size = A.length; if(size==1){ // handle one element array if(A[0]==1){ return 2; }else{ return 1; } } Arrays.sort(A); // sort by JDK if(A[0]>

整理小朋友在noi.openjudge上的作业(4)

第四章(含小学奥数)计97题,已完成8题 4.1 算法之排序和算法性能   题目ID 标题 分数 尝试人数   1625 Sequence Median 10 90   1754 字符串数组排序问题 10 49   1999 日志排序 10 50   4363 瑞士轮 10 101 4.2 算法之数论   题目ID 标题 分数 尝试人数   1350 Euclid's Game 10 223   1486 A Funny Game 10 70   185 反正切函数的应用 10 44   241

”高精度整数删去若干位以使剩下的值最小“问题

问题描述: 键盘输入一个高精度的正整数N(不超过240位) ,去掉其中任意M个数字后剩下的数字按原左右次序将组成一个新的正整数. 编程对给定的N和M,寻找一种方案使得剩下的数字组成的新数最小.输出组成的新的正整数. 输入数据均不需判错. 如果去掉了某几个位后得到的新整数开头为0,保留0. 输入: 本题有多组测试数据,每组测试数据占一行. 一个高精度正整数N(N不超过240位)一个正整数M.(M为不大于N的长度的正整数) N,M由一个空格分开. 456547 1 456547 2 456547 3

把整数排成最小的数

题目:输入一个正整数数组,把数组中所有的数拼接成一个整数,输出最小的整数. 思路:设计一种新的比较规则来排序一个数组,证明这个比较规则有效. (1)两个数m,n,如果mn<nm,则说明m << n.证明按这个顺序排序得到的数是最小的数. 即如如果x1 << x2 << x3 << x4,则x1x2x3x4是最小的数. 证明:假如任意交换其中的2个数x2和x4,x1x2x3x4x5<<x1x2x4x3x5<<x1x4x2x3x5&

输出最小整数对

题目描述 第一行输入一个数n,1 <= n <= 1000,下面输入n行数据,每一行有两个数, 分别是x y.输出一组x y,该组数据是所有数据中x最小,且在x相等的情况下 y最小的. 输入描述: 输入有多组数据. 每组输入n,然后输入n个整数对. 输出描述: 输出最小的整数对. 分析: 根据题意,定义最小的整数对min,每输入一个数对x,y就判断一次,当符合条件 就更新min的值,最后得出min #include <iostream> using namespace std; s