[HDOJ5676]ztr loves lucky numbers(状压枚举,打表,二分)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5676

题意:输入一个正整数n(n <=10^18),求不小于n的只有4和7组成的数,且4和7数量相同

枚举2~18位偶数位的4、7的组合,01分别代表4或7。存下来后排序,二分查询。

trick就是LL存不下20位的数,但是n<=10^18,那么只要特判大于777777777444444444的数都输出44444444447777777777就行了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 typedef long long LL;
 5 const int maxn = 1000100;
 6 const int maxm = 22;
 7 LL f[maxn];
 8 LL n;
 9 int m;
10 int digit[maxm];
11
12 int main() {
13     // freopen("in", "r", stdin);
14     // freopen("out", "w", stdout);
15     int T;
16     scanf("%d", &T);
17     m = 0;
18     for(int len = 2; len <= 18; len+=2) {
19         int nn = (1 << len);
20         for(int i = 0; i < nn; i++) {
21             int a = 0, b = 0;
22             for(int j = 0; j < len; j++) {
23                 if((1 << j) & i) digit[j] = 4, a++;
24                 else digit[j] = 7, b++;
25             }
26             if(a != b) continue;
27             LL tmp = 0;
28             for(int j = 0; j < len; j++) {
29                 tmp = tmp * 10 + digit[j];
30             }
31             f[m++] = tmp;
32         }
33     }
34     sort(f, f+m);
35     while(T--) {
36         scanf("%lld", &n);
37         if(n > 777777777444444444LL) {
38             cout << "44444444447777777777" << endl;
39             continue;
40         }
41         cout << f[lower_bound(f, f+m, n) - f] << endl;
42     }
43     return 0;
44 }
时间: 2024-12-21 17:23:10

[HDOJ5676]ztr loves lucky numbers(状压枚举,打表,二分)的相关文章

hdu 5676 ztr loves lucky numbers(BC——暴力打表+二分查找)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5676 ztr loves lucky numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 594    Accepted Submission(s): 257 Problem Description ztr loves luck

hdu-5676 ztr loves lucky numbers(乱搞题)

题目链接: ztr loves lucky numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 ztr喜欢幸运数字,他对于幸运数字有两个要求 1:十进制表示法下只包含4.7 2:十进制表示法下4和7的数量相等 比如47,474477就是 而4,744,467则不是 现在ztr想知道最小的但不小于n的幸运数字是多少 输入描述 有TT(1≤T≤10?5??)组数据,

hdu 5676 ztr loves lucky numbers(dfs+离线)

Problem Description ztr loves lucky numbers. Everybody knows that positive integers are lucky if their decimal representation doesn't contain digits other than 4 and 7. For example, numbers 47, 744, 4 are lucky and 5, 17, 467 are not. Lucky number is

hdoj ztr loves lucky numbers 5676 (dfs模拟)

ztr loves lucky numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 918    Accepted Submission(s): 389 Problem Description ztr loves lucky numbers. Everybody knows that positive integers ar

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,这样子能从小到大

ztr loves lucky numbers(STL)

ztr喜欢幸运数字,他对于幸运数字有两个要求 1:十进制表示法下只包含4.7 2:十进制表示法下4和7的数量相等 比如47,474477就是 而4,744,467则不是 现在ztr想知道最小的但不小于n的幸运数字是多少 输入描述 有T(1≤n≤105)组数据,每组数据一个正整数n(1≤n≤1018) 输出描述 有T行,每行即答案 输入样例 2 4500 47 输出样例 4747 47 Hint 请尽可能地优化算法,考虑全面 LuckNum.h #include <iostream> class

hdu5676 ztr loves lucky numbers DFS

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5676 题意: 定义幸运数为:只存在4和7且4和7数量相等的数,给出n,求比>=n的最小幸运数 思路: 因为n最多18位,幸运数最大是10个4,10个7,这种情况特判掉,爆longlong,其他的暴力搜出所有长度从2-18的幸运数,因为最多9个4,9个7,然后二分找出比这个数大的那个数 代码: 1 #include <bits/stdc++.h> 2 using namespace std;

SPOJ BALNUM Balanced Numbers 状压+数位DP

一开始想了一个用二进制状压的方法,发现空间需要的太大,光光memset都要超时 = = 其实不用每次都memset 也可以用三进制,一开始直接打表出所有的状态转移就好 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream&g

cf285 D. Permutation Sum 状压 dfs打表

题意: 如果有2个排列a,b,定义序列c为: c[i] = (a[i] + b[i] - 2) % n + 1 但是,明显c不一定是一个排列 现在,给出排列的长度n (1 <= n <= 16) 问有多少种a,b的排列的组合的方案,使得得到的c也是一个排列 排列的组合a = x,b = y 与 排列的组合a = y,b = x算是2种方案 思路: 有3个排列,不妨假设排列a 为1,2,3,...,n 这样结果再 * n! 就是答案 考虑状压dp j是一个16位的数,记录b的n个数被用了哪些数