[2016-01-21][CF][96][B]
[2016-01-21][CF][96][B]
- /*************************************************************
- 时间:2016-01-20 20:21:43 星期三
- 题目编号:CF 96B
- 题目大意:
- 给定数 n, 求最小的 且 大于n的super lucky number
- super lucky number 指的是,由4和7组成,并且 4和 7 的个数相同
- 方法:
- 方法1:二进制枚举.
- 判断位数->二进制枚举可能情况->转换成对应的4-7数字->输出
- 方法2:dfs
- 每层dfs数字*10 +4 或者 +7 ,判断是否满足
- 方法3:打表,然后直接find
- 解题过程遇到问题:
- 方法2:
- dfs第一个得到的值,不是最小的,必须遍历完所有可能
- dfs过程中,可能会得到炒鸡大的数字,需要剪枝,大于100n的一定不可能是.
- *************************************************************/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include <vector>#include <list>#include <map>#include <set>#include <deque>#include <queue>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <cctype>#include <string>#include <cstring>#include <cstdio>#include <cmath>#include <cstdlib>#include <ctime>using namespace std;long long n,res;void dfs(long long cur,int cnt4,int cnt7){ if(cur > n * 100) return ; if(cur >= n && cnt4 == cnt7){ if(res > cur || res == 0) res = cur; return ; } dfs(cur*10+4,cnt4+1,cnt7); dfs(cur*10+7,cnt4,cnt7+1);}int main(){ scanf("%I64d",&n); res = 0; dfs(0,0,0); printf("%I64d\n",res); return 0;} |
浙公网安备 33010602011771号