2 4500 47
4747 47
dfs 出 long long 以内的所有幸运数,二分查找,超过 long long 的特判
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; typedef long long LL; const int maxn = 300000; LL num[maxn]; int cnt; void dfs(LL sum, int sf, int ss) //当前和,4的使用个数,7的使用个数 { if (sf + ss > 18) return; //超过18位,不再搜索了 if (sf == ss) num[cnt++] = sum; //4和7的个数相同,保存 dfs(10 * sum + 4, sf + 1, ss); //当前数后面添加一个4 dfs(10 * sum + 7, sf, ss + 1); //添加一个7 } int main() { cnt = 0; dfs(0, 0, 0); sort(num, num + cnt); int t; LL n; scanf("%d", &t); while (t--) { scanf("%lld", &n); int L = 1, R = cnt; //二分查找 while (L < R) { int M = L + (R - L) / 2; if (num[M] < n) L = M + 1; else R = M; } if (L == cnt) printf("44444444447777777777\n"); //超LL,特判 else printf("%lld\n", num[L]); } return 0; }可以用C++的STL中lower_bound 直接二分查找
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; typedef long long LL; const int maxn = 300000; LL num[maxn]; int cnt; void dfs(LL sum, int sf, int ss) //当前和,4的使用个数,7的使用个数 { if (sf + ss > 18) return; //超过18位,不再搜索了 if (sf == ss) num[cnt++] = sum; //4和7的个数相同,保存 dfs(10 * sum + 4, sf + 1, ss); //当前数后面添加一个4 dfs(10 * sum + 7, sf, ss + 1); //添加一个7 } int main() { cnt = 0; dfs(0, 0, 0); sort(num, num + cnt); int t; LL n; scanf("%d", &t); while (t--) { scanf("%lld", &n); if (n == 0) //题中说的n>=1,可是不加就WA了 { printf("47\n"); continue; } int k = lower_bound(num, num + cnt, n) - num; //二分查找 if (k == cnt) printf("44444444447777777777\n"); //超LL,特判 else printf("%lld\n", num[k]); } return 0; }