[算法] 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 一.使用背景 先说一下需要用到向量时钟的场景.我们在写数据时候,经常希望数据不要存储 ...
随机推荐
- Winform- 界面开发之布局控件"WeifenLuo.WinFormsUI.Docking"的使用
布局控件"WeifenLuo.WinFormsUI.Docking"是一个非常棒的开源控件,用过的人都深有体会,该控件之强大.美观.不亚于商业控件.而且控件使用也是比较简单的. 实 ...
- Xcode8 创建NSManageObject subclass方法
更新iOS8之后发现coredata也做了一些改变,创建本地的时候一脸懵逼,最后发现: 喜极而泣不能自已,(-.-!)
- 关于自定义adapter使用getApplicationContext()影响主题
最近弄了一个东西,listview+switch构成界面 关于android自定义adapter,继承自baseadapter,发现界面的switch开关主题变了想要的是浅色的主题,但是却发现变成了深 ...
- 【转】通过CMD命令设置定时关机及ShutDown命令大全
经常会遇到这种情况:现在有个事情要离开很长时间,到那还在下载一个东西仅差10分钟就完成了,或者杀毒之类,不想让电脑一直开着也不想现在就停止工作.这是就会用到定时关机. 电脑系统设置(CMD命令)智能关 ...
- Android设计模式(1)----单例模式
在非常多设计模式中.我相信大多数程序员最早接触的设计模式就是单例模式啦,当然了我也不例外. 单例模式应用起来应该是全部设计模式中最简单的.单例模式尽管简单,可是假设你去深深探究单例模式,会涉及到非常多 ...
- 记 Ubuntu14.04 Monodevelop 安装的两个问题
1. Monodevelop 不能执行,显示错误 The assembly mscorlib.dll was not found or could not be loaded. 首先要确定mono安装 ...
- MySQL 中的两种临时表
来源:阿里云RDS - 数据库内核组 链接:http://mysql.taobao.org/monthly/2016/06/07/ 外部临时表 通过CREATE TEMPORARY TABLE 创建的 ...
- 解决Windows2008Server上PLSQL登录时报ORA-12557
公司的Oracle服务端是安装在一台Linux服务器上,版本号为11.1.0.7.0.我们开发的系统部署在Windows 2008 Server(x64),因为偶尔需要调用Oracle数据库,所以最开 ...
- 第一章 01 namespace 命名空间
一.什么是namespace? namesapce是为了防止名字冲突提供的一种控制方式. 当一个程序需要用到很多的库文件的时候,名字冲突有时无法避免.之前的解决思路是使用更长的变量名字,使用不方便. ...
- ExtJs 下拉菜单分页工具插件 代码分析
Ext.ns("Ext.ux"); //创建插件对象 Ext.ux.PageSizePlugin = function(){ //调用父对象的构造方法,并为此插件生成一个预定义st ...