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. JeeSite信息化快速开发平台

     平台简介 JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的开源Java EE快速开发平台. JeeSite是您快速完成项目的最佳基础平台解决方案,JeeSite是您 ...

  2. 关于oracle sql语句查询时 表名和字段名要加双引號的问题具体解释

      作为oracle的刚開始学习的人相信大家一定会遇到这个问题.如图:          明明就是navicat可视化创建了表,但是就是不能查到!这个为什么呢?           select * ...

  3. 使WordPress改域名后网站正常运行的方法

    使WordPress改域名后网站正常运行的方法 wp-content/wp-config.php $path = '/blog'; $scheme = (isset($_SERVER['HTTPS'] ...

  4. js28--适配器模式

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  5. Android学习笔记进阶九之Matrix对称变换

    网上很多的倒影特效实际上就是一个对称变换,在改变透明度即可. Matrix对称变换包括很多种,有关于Y轴对称,关于X轴对称,关于y= -x对称等等. 1 关于Y轴对称 // 获取资源文件的引用res ...

  6. 11.Bean2Document-BEAN转document

    1. package com.glodon.gspm.adapter.plugin.common; import com.glodon.cloudt.tenancy.context.TenantCon ...

  7. Vue的全选功能实现思路

    全选功能的实现主要分两步: 1. 点击全选框选中所有选择框. 2. 当所有选择框都被选中时,勾选全选框. 详细思路: 1. 点击全选框选中所有选择框: 给全选框绑定一个值,然后添加change时间,当 ...

  8. CSS笔记 - SVG Polyline 图片绘制动画边框

    <style> div{ width: 420px; height: 200px; background: url('./img/timg.jpg') no-repeat; } polyl ...

  9. Vijos——T 1164曹冲养猪

    https://vijos.org/p/1164 描述 自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲满不高兴,于是在工作中马马虎虎,有一次曹操想知道母猪的数 ...

  10. Scala入门到精通——第二十九节 Scala数据库编程

    本节主要内容 Scala Mavenproject的创建 Scala JDBC方式訪问MySQL Slick简单介绍 Slick数据库编程实战 SQL与Slick相互转换 本课程在多数内容是在官方教程 ...