ztr loves lucky numbers
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 330 Accepted Submission(s): 133
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 super lucky if it's decimal representation contains equal amount of digits 4 and 7. For example, numbers 47, 7744, 474477 are super lucky and 4, 744, 467 are not.
One day ztr came across a positive integer n. Help him to find the least super lucky number which is not less than n.
Lucky number is super lucky if it's decimal representation contains equal amount of digits 4 and 7. For example, numbers 47, 7744, 474477 are super lucky and 4, 744, 467 are not.
One day ztr came across a positive integer n. Help him to find the least super lucky number which is not less than n.
Input
There are T(1≤n≤105) cases
For each cases:
The only line contains a positive integer n(1≤n≤1018). This number doesn't have leading zeroes.
For each cases:
The only line contains a positive integer n(1≤n≤1018). This number doesn't have leading zeroes.
Output
For each cases
Output the answer
Output the answer
Sample Input
2 4500 47
Sample Output
4747 47
当n > 777777777444444444结果会爆long long,需要对这一个特判一下,别的都数位dfs
然后将dfs找到的数都放到一个数组a中,排序后用二分找大于等于n的第一个数
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
ll a[266666];
int len;
void dfs(int x, int y, ll num) {
if (x == 0 && y == 0) {
a[++len] = num;
return;
}
if (x > 0)
dfs(x - 1, y, num * 10 + 4);
if (y > 0)
dfs(x, y - 1, num * 10 + 7);
}
int main()
{
int T;
ll n;
scanf("%d", &T);
len = 0;
for (int i = 2; i <= 18; i += 2) {
dfs(i / 2, i / 2, 0);
}
sort(a + 1, a + 1 + len);
while (T--) {
scanf("%I64d", &n);
if (n > 777777777444444444) {
puts("44444444447777777777");
}
else {
int l = 1, r = len;
ll ans;
while (l <= r) {
int mid = (l + r) / 2;
if (a[mid] >= n) {
ans = a[mid];
r = mid - 1;
}
else {
l = mid + 1;
}
}
printf("%I64d\n", ans);
}
}
return 0;
}

本文讨论了正整数中的幸运数和超级幸运数的概念,并提供了寻找至少大于给定数字n的最小超级幸运数的方法。通过数位深度优先搜索(DFS)找到所有超级幸运数,然后使用二分查找定位目标数。
193

被折叠的 条评论
为什么被折叠?



