喵哈哈村的魔法考试 Round #5 (Div.2) B
喵哈哈村的狼人杀大战(2)
发布时间: 2017年3月5日 22:47 时间限制: 1000ms 内存限制: 128M
喵哈哈村最近热衷于玩一个叫做狼人杀的游戏!
星星同学今天她抽到的是狼的身份,按照她的一贯玩法,她喜欢无情的屠杀掉所有的神。
她现在已经很清楚了场上的预言家,女巫,猎人是谁。但是她唯一不知道的就是白痴这张神牌在谁的身上。于是她诈一诈她的下家——天行廖。
星星同学的逻辑是这样的:她可以考一道题给天行廖,如果天行廖能够答上来的话,那么天行廖肯定不是白痴,因为白痴是答不上题的。
这道题是这样的:
如果一个数只包含4和7的话,那么这个串就是幸运数,比如4777,774就是幸运数,而467就不是幸运数。
如果一个幸运数中包含的4和7的数量相同的话,那么这个数就是超级幸运数,比如4747就是超级幸运串,447就不是。
现在给你一个n,你需要找到一个最小的超级幸运数,并且这个超级幸运数大于等于n。
本题包含若干组测试数据。
第一行一个整数n。
满足 1<=n<=10^9
输出最小的超级幸运数,。
复制
47 4500
47 4747
一开始看错题意了...以为是小于等于n的最大幸运数...
后来才发现是大于等于n...
原来我的做法就是枚举啊...(辣鸡就只能想到枚举 了)
后来看题解...dfs可以解决啊...
去搜4和7的个数...然后check
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<stdlib.h> 5 #include<cstring> 6 #include<map> 7 using namespace std; 8 typedef long long ll; 9 ll n, ans; 10 map<ll, int>flag; 11 12 void dfs(int x, int y, ll sum){ 13 if(sum>=1e11)return; 14 if(flag[sum]==1)return; 15 if(x==y&&sum>=n){ 16 ans=min(ans, sum); 17 flag[sum]=1; 18 return; 19 } 20 dfs(x+1, y, sum*10+4); 21 dfs(x, y+1, sum*10+7); 22 } 23 void solve(){ 24 ans=1e10; 25 flag.clear(); //每次计算都要记得初始化... 26 dfs(0, 0, 0); 27 cout<<ans<<endl; 28 } 29 int main(){ 30 while(cin>>n){ 31 solve(); 32 } 33 34 return 0; 35 }