hdu 5676 ztr loves lucky numbers
题目链接:hdu 5676
一开始看题还以为和数位dp相关的,后来才发现是搜索题,我手算了下,所有的super lucky number(也就是只含数字4, 7且4, 7的数量相等的数)加起来也不过几万个,可以采用打表的方法来把所有的super lucky number存储起来。因为4,7数量须相等,所以可以用一个二进制数的0,1来代替,先限定4,7数量分别为 i,之后就是求出包含 i 个0和 i 个1的 2*i 位所有这样的二进制数,然后简单转换一下(1->7, 0->4,这样子能从小到大 push 进 vector 中)得到对应的4,7数量分别为 i 的super lucky number,i 从1枚举到9(因为9*2=18达到了long long的上限)就能得到所有的super lucky number了,打好表后剩下的便是二分查找了。一开始wa了一发,后来才知道需要特判,因为打的表中最大的数只达到777777777444444444(9个4,9个7),对于比这个更大的数可以直接知道是44444444447777777777(10个4,10个7)。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
typedef unsigned long long ull;
#define For(i,s,t) for(int i = s; i != t; ++i) vector<ull> luckys;
ull p10[] = {, , }; // 对于二进制数 x 做一个简单的转换
inline ull trans(int x, int m) {
ull num = ;
For(j, , m)
num += ((x & ( << j)) ? : ) * p10[j];
return num;
} // 求所有含有num1个1和num1个0的2*num1位的二进制数
template <typename T>
inline void cal(int num1, vector<T> &vec) {
int Max = , high = num1 << ;
For(j, num1, high) Max |= ( << j);
int st = ;
For(j, , num1) st |= ( << j);
while(st <= Max) {
vec.push_back(trans(st, high));
int x = st & -st, y = st + x; // 这个是《挑战》书上的模板,从小到大枚举二进制数中含有固定数量'1'的所有数
st = ((st & ~y) / x >> ) | y;
}
} inline void init(int n = ) {
For(i, , )
p10[i] = p10[i - ] * ;
For(i, , n + )
cal(i, luckys);
} // 模板函数二分查找vec中大于等于x的第一个元素
template <typename T>
inline int _find(const vector<T> &vec, const T &x) {
int mid, low = , up = vec.size() - ;
while(low <= up) {
mid = low + ((up - low) >> );
if(x < vec[mid] || !(vec[mid] < x)) up = mid - ;
else low = mid + ;
}
return low;
} int main() {
init();
int t;
ull n;
scanf("%d", &t);
while(t--) {
scanf("%llu", &n);
if(n > ) puts(""); // 需要特判
else {
int id = _find(luckys, n);
printf("%llu\n", luckys[id]);
}
}
return ;
}
后来在网上看了下,发现还能直接深搜打表的,简单又清晰多了:
void dfs(ull sum, int num4, int num7) {
if(num4 == && num7 == ) {
luckys.push_back(sum);
return ;
}
if(num4) dfs(sum * + , num4 - , num7);
if(num7) dfs(sum * + , num4, num7 - );
}
inline void init() {
For(i, , )
dfs(, i, i);
}
得到的同样是从小到大的顺序,dfs结束后不用再排序。
hdu 5676 ztr loves lucky numbers的更多相关文章
- HDU 5676 ztr loves lucky numbers (模拟)
ztr loves lucky numbers 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/I Description ztr ...
- hdu 5676 ztr loves lucky numbers(dfs+离线)
Problem Description ztr loves lucky numbers. Everybody knows that positive integers are lucky if the ...
- hdu 5676 ztr loves lucky numbers 打表+二分
ztr loves lucky numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- HDU 5676 ztr loves lucky numbers【DFS】
题目链接; http://acm.hdu.edu.cn/showproblem.php?pid=5676 题意: 由4和7组成的且4和7出现次数相同的数称为幸运数字,给定n,求不大于n的最大幸运数字. ...
- hdu-5676 ztr loves lucky numbers(乱搞题)
题目链接: ztr loves lucky numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- ztr loves lucky numbers 傻逼的我来了个大模拟
http://acm.hdu.edu.cn/showproblem.php?pid=5676 这题的正解因该是dfs的,但是有18个位,然后我一算,全排列的话,有18!个啊,那不是很大?但是有很多是相 ...
- hdu5676 ztr loves lucky numbers(dfs)
链接 ztrloveslucky numbers 题意 定义幸运数为:只存在4和7且4和7数量相等的数,给出n,求比>=n的最小幸运数 做法 暴力搜出所有长度从2-18的幸运数,因为最多9个4, ...
- HDU 5677 ztr loves substring(Manacher+dp+二进制分解)
题目链接:HDU 5677 ztr loves substring 题意:有n个字符串,任选k个回文子串,问其长度之和能否等于L. 题解:用manacher算法求出所有回文子串的长度,并记录各长度回文 ...
- HDU 5675 ztr loves math (数学推导)
ztr loves math 题目链接: http://acm.hust.edu.cn/vjudge/contest/123316#problem/A Description ztr loves re ...
随机推荐
- (转)如何学习Java技术?谈Java学习之路
51CTO编者注:这篇文章已经是有数年“网龄”的老文,不过在今天看来仍然经典.如何学习Java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领 ...
- Javascript模块化编程(三):require.js的用法(转)
这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库require.js. 一.为什么要用require.js? 最早的 ...
- Windows Phone 十四、磁贴通知
磁贴(Tile) Windows Phone 磁贴种类: 小尺寸 SmallLogo:71x71: Square71x71 中等 Logo:150x150: Square150x150 宽 WideL ...
- 最好的cpm广告联盟哪里有
最好的cpm广告联盟哪里有,58传媒广告联盟还要提醒众位站长的是网站在经营发展中必须最大化的扩展自己的优势力量.每个网站都有属于自己的优势魅力,这些优势特点只有得到最大化的发挥才能为网站带来意想不到的 ...
- Flexbox布局(转)
Flexbox布局( Flexible Box 或CSS3 弹性布局),是CSS3中的一种新的布局模式,是可以自动调整子元素的高和宽,来很好的填充任何不同屏幕大小的显示设备中的可用显示空间,收缩内容防 ...
- DNS-3
- 基于ThinkPHP开发的PHPExcel导入
首先,我们还是要导入PHPExcel类文件...至于怎么导入.可以参考我写的导出的那篇文章(http://www.cnblogs.com/hopelooking/p/6230303.html) 但是我 ...
- angular-笔记
ng-model 指令ng-model 指令 绑定 HTML 元素 到应用程序数据.ng-model 指令也可以:为应用程序数据提供类型验证(number.email.required).为应用程序数 ...
- FunsionCharts图标控件点击
1.点击执行js 在页面中添加点击chart后需要触发的js事件: <script> functionmyJS(myVar){ window.alert(m ...
- android应用刷新系统多媒体库(增加or删除多媒体文件)
系统:android4.4及其以上 功能:app中拍照, 并实现浏览.删除照片操作. 实现: 1.拍照,存储到指定路径path 2.通知系统多媒体数据库刷新数据. 主要使用MediaScannerCo ...