[算法] get_lucky_price price
int get_lucky_price(int price, const vector & number) 题意大概是给你一个数price,比如1000,然后有unlucky_num,有{1,4,7,5},要求price里面不能出现unlucky,又不能出现0,也就是unlucky至少包括0,别忘记了这个。求满足要求的大于等于price的最小值,所有的数字都是lucky的。上面的答案是2222。不知道我理解的题意对不对。
看到这道题,我感觉这道题挺相似Numeric Keypad,有时间可以做一下。
直接想法就是从高位到低位,然后找不满足要求的,然后往上增加,比如1000,第一个数是1,不满足,第一个比1大的满足要求的为2,然后这位变为2,这时候,后面的数都不需要考虑了,直接设置为lucky里面的最小值即可。因为要满足尽可能的小,后面的只需要保持lucky,然后最小即可。
这里面有一个trick,找到第一个,不满足要求的,可能需要进位,假如unluck为{8,9},price为2779,然后第一个不满足要求为第四位上的9,然后进位,发现进位后7变为8,8也是不满足要求的,这个时候就需要找到最左边的进位满足要求的,有时候甚至需要在开始的位置补一个数字,然后剩下的数字设置为最小的符合要求的即可。
大概思想就是这样,昨天看到这题,想到上面那道,但是没仔细分析,其实套路一样,还有昨天时间实在紧张,没有做出来。
有时间补一下代码。
int get_lucky_price(int price, const vector<int> & number) {
vector<bool> tag(10, 0);
tag[0] = 1;
for (int i = 0; i < number.size(); i++) {
tag[number[i]] = 1;
}
int mi = -1,ma = -1;
for (int i = 0; i < 10; i++) {
if(tag[i]) continue;
if(mi == -1) {
mi = ma = i;
} else {
ma = i;
}
}
//cout << mi << " " << ma << endl;
stringstream ss; ss << price;
string s = ss.str();
bool flag = 0;
for (int i = 0; i < s.size(); i++) {
int cur = s[i] - '0';
if(!tag[cur]) continue;
if(cur > ma) {
int k = i - 1;
while(k >= 0 && s[k] - '0' == ma) k--;
if(k < 0) {
string t(s.size() + 1, '0' + mi);
s = t;
} else {
//cout << "asd" << endl;
for (int j = s[k] - '0' + 1; j < 10; j++) {
if(!tag[j]) {
s[k] = '0' + j;
break;
}
}
string t = s.substr(0, k + 1);
t.append(s.size() - k - 1, '0' + mi);
s = t;
break;
}
} else {
for (int j = cur + 1; j < 10; j++) {
if(!tag[j]) {
s[i] = '0' + j;
break;
}
}
string t = s.substr(0, i + 1);
t.append(s.size() - i - 1, '0' + mi);
s = t;
break;
}
}
stringstream s1; s1 << s;
int res; s1 >> res;
return res;
}
void solve() {
vector<int> v;v.pb(1);v.pb(4);v.pb(8);v.pb(9);
cout << get_lucky_price(388, v) << endl;
}
[算法] get_lucky_price price的更多相关文章
- 拿什么拯救你,我的代码--c#编码规范实战篇
此文为译文,原文地址请点击. 本文通过重构一个垃圾代码,阐述了如何写出优秀的代码.开发人员及代码审核人员需按照此规范开发和审核代码.此规范以C#为例,JAVA的童鞋一并参考,C++的童鞋自行脑补吧. ...
- 拿什么拯救你,我的代码--c#编码规范实战篇 (转)
http://www.cnblogs.com/lazio10000/p/5413439.html 此文为译文,原文地址请点击. 本文通过重构一个垃圾代码,阐述了如何写出优秀的代码.开发人员及代码审核人 ...
- MongoDB@入门一
安装MongoDB自行搜索, 我这里提供GUI版本类似navicat. 1. 数据库层面 show dbs #查看服务器上的数据库 [local 0.000GB] use test #切换到指定 ...
- vue + element ui 实现实现动态渲染表格
前言:之前需要做一个页面,能够通过表名动态渲染出不同的表格,这里记录一下.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9786326.html 网站地址:我的 ...
- 【机器学习PAI实战】—— 玩转人工智能之商品价格预测
摘要: 我们经常思考机器学习,深度学习,以至于人工智能给我们带来什么?在数据相对充足,足够真实的情况下,好的学习模型可以发现事件本身的内在规则,内在联系.我们去除冗余的信息,可以通过最少的特征构建最简 ...
- 差分进化算法 DE-Differential Evolution
差分进化算法 (Differential Evolution) Differential Evolution(DE)是由Storn等人于1995年提出的,和其它演化算法一样,DE是一种模拟生物进化 ...
- Adaboost 算法
一 Boosting 算法的起源 boost 算法系列的起源来自于PAC Learnability(PAC 可学习性).这套理论主要研究的是什么时候一个问题是可被学习的,当然也会探讨针对可学习的问题的 ...
- fcc的高级算法题
核心提示:本部分一个9道题,给定时间50小时.属于fcc前端学习的"高级编程脚本"题,对于初学者来说,确实算是"高级"了.如果只想着闭门造车,50小时确实也不过 ...
- 向量时钟算法简介——本质类似MVCC
转自:http://blog.chinaunix.net/uid-27105712-id-5612512.html 一.使用背景 先说一下需要用到向量时钟的场景.我们在写数据时候,经常希望数据不要存储 ...
随机推荐
- C#- Winform调用BAT例子
前段时间在工作的时候需要用到,百度了好久后找,可是找到了又希望调用的时候窗体不要显示出来. proc.StartInfo.CreateNoWindow = true; proc.Start ...
- Abel 分部求和法
本文之所以叫Abel分部求和法而不叫Abel分部求和公式,是因为求和公式有可能形式上有所不同,但是方法确实相同的. $$\sum_{n=M}^{N}a_{n}b_{n} = \sum_{n=M}^{N ...
- Android studio插件安装
Android Studio安装插件的方式其实和Eclipse大同小异.废话不多说,直接上图: 区域1:你当前已经安装了的插件 区域2:在线安装 区域3:从硬盘安装,即针对你已经下载好了的插件,可通过 ...
- 【09】绝不在构造和析构过程中调用virtual方法
1.绝不在构造和析构过程中调用virtual方法,为啥? 原因很简单,对于前者,这种情况下,子类专有成分还没有构造,对于后者,子类专有成分已经销毁,因此调用的并不是子类重写的方法,这不是程序员所期望的 ...
- go strings 常用的几个函数
fmt.Println(strings.ToUpper("hello world")) //转换为大写 fmt.Println(strings.ToLower("H ...
- Android Touch事件原理加实例分析
Android中有各种各样的事件,以响应用户的操作.这些事件可以分为按键事件和触屏事件.而Touch事件是触屏事件的基础事件,在进行Android开发时经常会用到,所以非常有必要深入理解它的原理机制. ...
- 使用Zipalign工具优化Android APK应用记录
生成的Android应用APK文件最好进行优化,因为APK包的本质是一个zip压缩文档,经过优化能使包内未压缩的数据有序的排列,从而减少应用程序运行时的内存消耗.我们可以使用Zipalign工具进行A ...
- [RxJS] just, return
Sometime, we migth just want to return a object which wrap into Observable. You can use 'just' or ' ...
- MySQL和PostgreSQL 导入数据对照
在虚拟机上測评了下MySQL 和 PostgreSQL 的各种LOAD FILE方式以及时间. 由于是虚拟机上的測评,所以时间仅仅做參考,不要太较真, 看看就好了.MySQL 工具: 1. 自带 ...
- 05---JSON学习(Java)
一.简介 JSON:JavaScript对象表示法(JavaScript object Notation) JSON是存储和文本交换信息的语法 JSON ...