Time Limit: 3 second

Memory Limit: 2 MB

【问题描述】

输入一个数字串S和整数K(K小于数字串S的长度),从S中删去K个数字,使剩余数字在保持相对位置不变的情况下构成一个值最小的整数。例如:S='19990608',K=4,处理结果为608。如果串S含有非数字字符,则输出'error',如果K的值大于串S的长度,则输出'error'。

【输入】

两行,第一行为数字串S,第二行为整数K。

【输出】

一行,处理结果或error

【输入样例】

19990608

    4

【输出样例】

    608

【题解】

这是一道贪心题。

先考虑一种比较简单的情况。

123456,接下来 删除一个数字。

如果删掉1 就是2 开头了

这显然不是最小的,因为我们可以删掉2,那这个数字就是1开头的了,但删掉2第二位是3,如果删掉3 第二位就是2 这样更优。。。

如此如此可以知道 删掉6是最优的情况。

再来复杂点

489456 这里就不能单纯地删掉6了。我们可以把它分成两个部分

489 和 456 如果单纯対这两个数做删除操作 我们可以容易地得到答案。

那么问题来了,我们应该删掉9还是删掉6呢?

答案是9,因为如果我们让后者更小,最后结果是489XXX

而如果让前者更小,最后结果则是484XXX,显然让前者更小是更优的解法。

或者你可以把这489和456看成X和Y,然后把这两个数组成一个2位数

最后的结果是X*10+Y,那让X更小显然是更优的解。

如果是484950这个 就把 48 和49 和50 看成X,Y,Z显然也是让X最小是最优的解。

就是这样吧。

这里的9和6是两个递增区间的最后一个数字。

while (a[i] <= a[i+1]) i ++ ,这样找到i,然后用erase删掉就好。

不要忘记去除开头可能多余的0;

【代码】

#include <cstdio>
#include <string>
#include <iostream>
#include <stdlib.h> using namespace std;
string s1;
int n,k; void s_p()
{
printf("error");
exit(0);
} void input_data()
{
cin >> s1;
n = s1.size();
scanf("%d",&k);
if (k > n) //如果输入的K不符合要求,则判错
s_p();
if (k == n) //
{
printf("0");
exit(0);
}
} void get_ans()
{
for (int i = 0;i < n;i++)
if (s1[i] < '0' || s1[i] > '9') //如果有非法字符 也判错
s_p();
for (int i = 1;i <= k;i++) //删除k个数字
{
int j = 0;
while (s1[j] <= s1[j+1]) j++; //找到第一个递增区间的最后一个数字
s1 = s1.erase(j,1); //删掉这个数字。
}
int m = s1.size();
int i = 0;
while (m > 1 && s1[i] == '0') //删掉开头多余的0
{
s1 = s1.erase(0,1);
m--;
} } void output_ans()
{
cout << s1 << endl;
} int main()
{
input_data();
get_ans();
output_ans();
return 0;
}

【3002】删去K个数字的更多相关文章

  1. 删去k个数字后的最小值

    public static String removeKDigits(String num,int k) { //新整数的最终长度=原长度 - k int newLength=num.length() ...

  2. [LeetCode] Find K Pairs with Smallest Sums 找和最小的K对数字

    You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k. Define ...

  3. 面试题:m个长度为n的ordered array,求top k 个 数字

    package com.sinaWeibo.interview; import java.util.Comparator; import java.util.Iterator; import java ...

  4. Hulu面试题解答——N位数去除K个数字(解法错误sorry)

    给定一个N位数,比如12345,从里面去掉k个数字.得到一个N-k位的数.比如去掉2,4,得到135,去掉1,5.得到234.设计算法.求出全部得到的N-k位数里面最小的那一个. 写的代码例如以下,思 ...

  5. [SOJ]寻找第k大数字(numberk)

    Description 经过长时间的筹备工作,在Jourk,Ronny,Plipala,阿长,阿沈等人的努力下,DM实验室建立起自己的系列网站,其中包括三个大板块:DMOJ首页.DMOJ论坛.DMOJ ...

  6. [Swift]LeetCode373. 查找和最小的K对数字 | Find K Pairs with Smallest Sums

    You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k. Define ...

  7. [Swift]LeetCode402. 移掉K位数字 | Remove K Digits

    Given a non-negative integer num represented as a string, remove k digits from the number so that th ...

  8. 区间求小于等于k的数字个数 hdu4177

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目意思给出一个序列,叫我们求一个区间里面小于等于k的数字个数. 这里面我用分块和主席树两种方法 ...

  9. 字典序的第K小数字

    今天zyb参加一场面试,面试官听说zyb是ACMer之后立马抛出了一道算法题给zyb:有一个序列,是1到n的一种排列,排列的顺序是字典序小的在前,那么第k个数字是什么?例如n=15,k=7, 排列顺序 ...

随机推荐

  1. Codefroces Educational Round 27 845G Shortest Path Problem?

    Shortest Path Problem? You are given an undirected graph with weighted edges. The length of some pat ...

  2. jq实现回车键执行方法

    $(function(){ $(document).keypress(function (e){ if(e.keyCode == 13){ //执行你想执行的方法,keyCode代表不同的按键 } } ...

  3. Easy mock - 安装配置和基本使用

    Easy-mock easy-mock是一款比较好用的接口模拟工具, 使用之前我们需要安装和配置 需要下载的内容有以下 Node Redis MongoDB Node和Redis一路点下一步就行, M ...

  4. Android中级第十讲--相机录像和查看系统相册图片

    博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 录像比较简单,开始录制: myCamera.unlock(); ...

  5. 阿姆达尔定律(Amdahl's law)

    首先给出阿姆达尔定律的数学公式描述: S(N)=1(1−p)+pN p:程序中可并行部分的程序在单核上执行时间的占比: N:处理器的数目(总的核心数) S(N):程序在 N 个处理器(总核心数)相对在 ...

  6. InstallShield详细制作说明(一)

    虽然网上关于InstallShield的制作说明已经很多,但是看的时候还是会有些晕乎乎的,不得不说很复杂.前段时候做了一次,后面需要升级,在重新做的时候发现有些地方自己又忘了,所以有必须将自己看的教程 ...

  7. UVA 11488 Hyper Prefix Sets (字典树)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. Hi35xx NVR GDB调试

    Hi35xx NVR GDB调试   1. 下载gdb源代码 嵌入式Linux 的GDB 调试环境由Host 和Target 两部分组成,Host 端使用arm-linuxgdb,Target Boa ...

  9. Akka边学边写(4)-- MiniRPG

    前面几篇文章用Akka写了HelloWorld和EchoServer,为了更进一步学习Akka,本文将会实现一个非常小的RPG游戏server:MiniRPG. 游戏逻辑 由于是迷你RPG,所以逻辑非 ...

  10. Ubuntu配置图形桌面LXDE和VNC、中文语言包、中文输入法

    Ubuntu配置图形桌面LXDE和VNC.中文语言包.中文输入法 http://www.lijiejie.com/ubuntu-vps-config-lxde-vnc/ LXDE是Ubuntu图形桌面 ...