【3002】删去K个数字
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个数字的更多相关文章
- 删去k个数字后的最小值
public static String removeKDigits(String num,int k) { //新整数的最终长度=原长度 - k int newLength=num.length() ...
- [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 ...
- 面试题:m个长度为n的ordered array,求top k 个 数字
package com.sinaWeibo.interview; import java.util.Comparator; import java.util.Iterator; import java ...
- Hulu面试题解答——N位数去除K个数字(解法错误sorry)
给定一个N位数,比如12345,从里面去掉k个数字.得到一个N-k位的数.比如去掉2,4,得到135,去掉1,5.得到234.设计算法.求出全部得到的N-k位数里面最小的那一个. 写的代码例如以下,思 ...
- [SOJ]寻找第k大数字(numberk)
Description 经过长时间的筹备工作,在Jourk,Ronny,Plipala,阿长,阿沈等人的努力下,DM实验室建立起自己的系列网站,其中包括三个大板块:DMOJ首页.DMOJ论坛.DMOJ ...
- [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 ...
- [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 ...
- 区间求小于等于k的数字个数 hdu4177
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目意思给出一个序列,叫我们求一个区间里面小于等于k的数字个数. 这里面我用分块和主席树两种方法 ...
- 字典序的第K小数字
今天zyb参加一场面试,面试官听说zyb是ACMer之后立马抛出了一道算法题给zyb:有一个序列,是1到n的一种排列,排列的顺序是字典序小的在前,那么第k个数字是什么?例如n=15,k=7, 排列顺序 ...
随机推荐
- IDLE的自动补全功能
IDLE的自动补全功能位于:Edit→Show Completions,但每次需要补全的时候都需要点击一次,虽然IDLE提供了一个快捷键(Ctrl + Space),但实测无效.具体操作如下图
- CSS Loading 特效
全页面遮罩效果loading css: .loading_shade { position: fixed; left:; top:; width: 100%; height: 100%; displa ...
- Ubuntu下SVN服务器安装和配置
一.SVN安装1.安装包$ sudo apt-get install subversion 2.添加svn管理用户及subversion组#添加用户$ sudo adduser svnuser#添加 ...
- opencv标定程序(改动)
转载请注明来自:http://blog.csdn.net/zhouyelihua/article/details/38421377 资源下载见:点击打开链接 百度云盘免积分下载:https://pan ...
- hdu4336Card Collector 概率dp+状态压缩
//给n个卡片每次出现的概率,求全部卡片都出现的须要抽的次数的期望 //dp[i]表示在状态的情况下到全部的卡片都出现的期望 //dp[i] = 1 + p1*dp[i] + ${p2[j]*dp[i ...
- PHP 实现断点续传的原理和方法
PHP 实现断点续传的原理和方法 0. http协议从1.1开始支持静态获取文件的部分内容,为多线程下载和断点续传提供了技术支持.它通过在Header里两个参数实现的,客户端发请求时对应的是Accep ...
- javascript进阶课程--第二章--对象
javascript进阶课程--第二章--对象 学习要点 理解面向对象的概念 掌握对象的创建方法 掌握继承的概念和实现方法 基本概念 对象究竟是什么?什么叫面向对象编程? 对象是从我们现实生活中抽象出 ...
- Wiz+360云盘,让你的知识库井井有条
用了wiz快两年了,一些同事看到我在找资料时打开wiz,总会好奇的问这是什么,想到还有很多同仁在用文件夹管理知识库,于是想分享一下我的管理方法.(PS:鄙人愚见,如有高见,望指教) Wiz为知笔记下载 ...
- 使用PyCharm安装第三方库
使用PyCharm安装第三方库是一种十分简单的做法,接下来我来演示一下在PyCharm上安装第三方库requess的操作流程. 首先,先看一下当第三方库未安装时的提示内容,在pycharm中新建pyt ...
- 用PHP 去掉所有html标签里的部分属性
用PHP 去掉所有html标签里的部分属性 http://zhidao.baidu.com/question/418471924.html 用PHP 去掉所有html标签里的部分属性 tppabs & ...