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.
 
Input
There are T(≤n≤) cases

For each cases:

The only line contains a positive integer n(≤n≤). This number doesn't have leading zeroes.
 
Output
For each cases
Output the answer
 
Sample Input

Sample Output

直接暴力显然TLE,考虑按位DFS

每一位只可能是4或7

所以根据这个来DFS即可,时间复杂度O(T*2^{log_{10}n})O(T∗2​log​10​​n​​)

考虑到T特别大,不可能每次都DFS

而经过计算,2^{18}=2621442​18​​=262144,所以全部储存下来

对于每次询问,二分即可

考虑一个边界条件,即当结果爆ll怎么办?

即答案应当为10个4、10个7的时候,显然unsigned long long也不行

那么只能采用特判了

首先,由于每一位只能是4或7,且
2^{18}=2621442​18​​=262144,故而考虑离线打表,即利用dfs求解出所有只含数字4和7,且4和7数量相等的数
 void dfs(ll sum,int c1,int c2){
if(c1>=k1 && c2>=k2){
ans[num++]=sum;
return;
}
if(c1<k1) dfs(sum*+,c1+,c2);
if(c2<k2) dfs(sum*+,c1,c2+);
}

结果存储在ans数组中,此时可以得到符合条件的数有66196+1个,而数据有T组,好吧,那就二分查找

int cnt = lower_bound(ans,ans+num,n)-ans;

需要注意的一点是,当n>777777777444444444的时候,18位数里面已经没有比这更大的符合条件的数了,那么只能特判一下,解为最小的20位符合条件的数,即44444444447777777777

AC代码:

 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define ll long long
#define N 1000000
int k1,k2;
ll ans[N];
int num;
ll n;
void dfs(ll sum,int c1,int c2){
if(c1>=k1 && c2>=k2){
ans[num++]=sum;
return;
}
if(c1<k1) dfs(sum*+,c1+,c2);
if(c2<k2) dfs(sum*+,c1,c2+);
}
void init(){
num=;
for(int i=;i<=;i+=){
k1=k2=i/;
dfs(,,);
}
}
int main()
{
init();
int t;
scanf("%d",&t);
while(t--){
scanf("%I64d",&n);
int cnt = lower_bound(ans,ans+num,n)-ans;
if(cnt<num){
printf("%I64d\n",ans[cnt]);
}else{
printf("44444444447777777777\n");
}
}
return ;
}

hdu 5676 ztr loves lucky numbers(dfs+离线)的更多相关文章

  1. hdu 5676 ztr loves lucky numbers 打表+二分

    ztr loves lucky numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  2. HDU 5676 ztr loves lucky numbers (模拟)

    ztr loves lucky numbers 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/I Description ztr ...

  3. hdu 5676 ztr loves lucky numbers

    题目链接:hdu 5676 一开始看题还以为和数位dp相关的,后来才发现是搜索题,我手算了下,所有的super lucky number(也就是只含数字4, 7且4, 7的数量相等的数)加起来也不过几 ...

  4. HDU 5676 ztr loves lucky numbers【DFS】

    题目链接; http://acm.hdu.edu.cn/showproblem.php?pid=5676 题意: 由4和7组成的且4和7出现次数相同的数称为幸运数字,给定n,求不大于n的最大幸运数字. ...

  5. hdu5676 ztr loves lucky numbers(dfs)

    链接 ztrloveslucky numbers 题意 定义幸运数为:只存在4和7且4和7数量相等的数,给出n,求比>=n的最小幸运数 做法 暴力搜出所有长度从2-18的幸运数,因为最多9个4, ...

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

    题目链接: ztr loves lucky numbers  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 65536/65536 K ( ...

  7. ztr loves lucky numbers 傻逼的我来了个大模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=5676 这题的正解因该是dfs的,但是有18个位,然后我一算,全排列的话,有18!个啊,那不是很大?但是有很多是相 ...

  8. ztr loves lucky numbers--hdu5676(DFS)

    http://acm.hdu.edu.cn/showproblem.php?pid=5676 题目大意: 给你一个数  让你找比这数大并且只含4和7  并且4和7的个数一样 枚举从0到10的18次方之 ...

  9. HDU 5677 ztr loves substring(Manacher+dp+二进制分解)

    题目链接:HDU 5677 ztr loves substring 题意:有n个字符串,任选k个回文子串,问其长度之和能否等于L. 题解:用manacher算法求出所有回文子串的长度,并记录各长度回文 ...

随机推荐

  1. 左侧高亮(js)

    //左导航高亮 (function(){ var leftnav = $('#leftnav');  //左侧ul var pi = __preset.curpathid; if(pi=='/acco ...

  2. 关于ionic传值

    今天,也是偶然发现有的初学者对ionic的传值还不太清除,这里我说明一下 例如你想在这个页面传递参数a.b过去,传递到"tab.wait"页面 $state.go("ta ...

  3. android 开发随笔 - 开发环境搭建

    1.1 问题: 'tools.jar' seems to be not in Android Studio classpath. Please ensure JAVA_HOME points to J ...

  4. Windows CMD命令之tasklist及taskkill

    Tasklist介绍 Tasklist"是 winxp/win2003/vista/win7/win8下的命令,用来显示运行在本地或远程计算机上的所有进程,带有多个执行参数. 使用格式 ta ...

  5. ant学习(1)

    路径:/home/framework_Study/springinAction/webRoot/WEB-INF <?xml version="1.0" encoding=&q ...

  6. SDK文件夹下内容介绍

    Platform-Tools: 这是 adb, fastboot 等工具包.把解压出来的 platform-tools 文件夹放在 android sdk 根目录下,并把 adb所在的目录添加到系统 ...

  7. 原创:2016.4.25-2016.5.1 C# informal essay and tittle_tattle

    1.Some  tips of the Time in C sharp (1) How to define the category of the "Datetime"? date ...

  8. nodejs 简单http 文件上传demo

    // 这是一个简单的Node HTTP,能处理当前目录的文件 // 并能实现良种特殊的URL用于测试 // 用http://localhost:8000 或http://127.0.0.1:8000 ...

  9. 技巧集:nginx作代理时,查看请求被转发到哪台服务器

    使用Nginx代理多台服务器实行负载的时候,如何查看某一个请求被转发到哪台服务器上呢? upstream demo { server 127.0.0.1:8781; server 127.0.0.1: ...

  10. bootstrap-paginator 分页控件的使用

    首先对js和css的引用 <link rel="stylesheet" href="reference/bootstrap/css/bootstrap.min.cs ...