ztr loves lucky numbers
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 938 Accepted Submission(s): 400
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
Source
Recommend
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;
}