题目链接http://codeforces.com/problemset/problem/95/B

题目大意:给你一个正整数n (1 ≤ n ≤ 10100000),求不大小于它的超级幸运数字(超级幸运数字就是只含有数字4和数字7,并且4和7的数目相同)

例:

Sample Input

4500

47

Sampule Output

4747

47

解题思路:压根没想到用DFS,开始就想着,先判断数字的个数是否是个奇数,如果是个奇数就很好办,直接加一位数字,前一半是4后一半是7,当它的数字个数为偶数时就模拟从高位一个一个判断的,然后发现好复杂就放弃了。然后又想用全排列就变得很简单了,但是这数字太大了可能又10的5次方位,大一点的数肯定就算不出来了。看了大佬的代码才知道还可以用DFS。

如果数字个数是奇数的情况下可以直接输出,如果是偶数我们就用DFS从高位开始搜索,含有4个参数,第一个参数是当前搜索的位置,还要有一个参数判断数字是否已经比原来那个更大了,还有两个参数是分别用来记录当前4和7可用的个数,初始时4和7可用的个数都是原来数长度的一半。对于数的每一位我们只需要判断两种情况,是否<=4,如果=4继续搜索,如果小于4,直接变成4这时数就比原来更大了,后面还有的位就分别先填充可用的4,再填充可用的7,这用就能保证它最小了。如果大于4,就判断是否<=7就可以了,和小于4同理操作。然后还有一种情况就是,所有数字都大于7,这时候就要多加两个数位,前一半是4后一半是7就够了。

附上代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char n[];
char ans[];
int len; bool dfs(int pos,int cnt4,int cnt7,bool toup)
{
if(pos==len) return true; //一直搜索到数字的尾部也未退出,说明它本身就是超级幸运数字
if(toup) //如果已经变大了就把没用用完的4和7填完,先填4再填7,返回
{
for(int i=;i<cnt4;i++)
ans[pos++]='';
for(int i=;i<cnt7;i++)
ans[pos++]='';
return true;
}
if(n[pos]<=''&&cnt4)
{
if(dfs(pos+,cnt4-,cnt7,n[pos]<''))
{
ans[pos]=''; //如果是<4将改为改成4
return true;
}
}
if(n[pos]<=''&&cnt7)
{
if(dfs(pos+,cnt4,cnt7-,n[pos]<''))
{
ans[pos]=''; //如果<7将该位改成7
return true;
}
}
return false; //未搜索到大于原数的
} int main()
{
while(cin>>n)
{
len=strlen(n);
if(len%||!dfs(,len/,len/,false)) //如果数位是奇数,或者搜搜索到的,直接先填4再填7
{
int x=(len%?(len+)/:(len+)/);
for(int i=;i<=x;i++)
cout<<;
for(int i=;i<=x;i++)
cout<<;
cout<<endl;
continue;
}
cout<<ans<<endl;
}
return ;
}

CodeForces - 95B(DFS)的更多相关文章

  1. codeforces 731C(DFS)

    题目链接:http://codeforces.com/contest/731/problem/C 题意:有n只袜子(1~n),k种颜色(1~k),在m天中,左脚穿下标为l,右脚穿下标为r的袜子,问最少 ...

  2. CodeForces - 589J —(DFS)

    Masha has recently bought a cleaner robot, it can clean a floor without anybody's assistance. Schema ...

  3. codeforces 723D(DFS)

    题目链接:http://codeforces.com/problemset/problem/723/D 题意:n*m的矩阵中,'*'代表陆地,'.'代表水,连在一起且不沿海的水形成湖泊.问最少填多少块 ...

  4. CodeForces - 589J(DFS)

    题目链接:http://codeforces.com/problemset/problem/589/J 题目大意:一个机器人打扫一个密闭的房间,房间由一个矩形构成,'*'表示家具,'.'表示该位置为空 ...

  5. Codeforces 761E(DFS)

    E. Dasha and Puzzle time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  6. Codeforces 115A- Party(DFS)

    A. Party time limit per test 3 seconds memory limit per test 256 megabytes input standard input outp ...

  7. LeetCode Subsets II (DFS)

    题意: 给一个集合,有n个可能相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: 看这个就差不多了.LEETCODE SUBSETS (DFS) class Solution { publ ...

  8. LeetCode Subsets (DFS)

    题意: 给一个集合,有n个互不相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: DFS方法:由于集合中的元素是不可能出现相同的,所以不用解决相同的元素而导致重复统计. class Sol ...

  9. HDU 2553 N皇后问题(dfs)

    N皇后问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在 ...

随机推荐

  1. spring MVC请求处理类注解属性详解

  2. js中style,currentStyle和getComputedStyle的区别以及获取css样式操作方法

    用js的style只能获取元素的内联样式,内部样式和外部样式使用style是获取不到的. currentStyle可以弥补style的不足(可获取内联样式,内部样式和外部样式),但是只适用于IE. g ...

  3. 为什么js中要用void 0 代替undefined

    这个是Backbone.js中的一句源码 if (callback !== void 0 && 'context' in opts && opts.context == ...

  4. java 中Excel的导入导出

    部分转发原作者https://www.cnblogs.com/qdhxhz/p/8137282.html雨点的名字  的内容 java代码中的导入导出 首先在d盘创建一个xlsx文件,然后再进行一系列 ...

  5. 【转】Java基础——容器分类

    Java容器可以说是增强程序员编程能力的基本工具,本系列将带您深入理解容器类. 容器的用途 如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构. 我们可以通过创建引用来持有对象,如 ...

  6. LAMP 版本查看

    mysql 1 在终端下执行 mysql -V 2  mysql --help |grep Distrib 3 在mysql 里查看 select version() 4 在mysql 里查看 sta ...

  7. python之路--关于线程的一些方法

    一 . 线程的两种创建方式 from threading import Thread # 第一种创建方式 def f1(n): print('%s号线程任务'%n) def f2(n): print( ...

  8. Java集合和数组的区别

    参考:Java集合和数组的区别 集合和容器都是Java中的容器. 区别 数组特点:大小固定,只能存储相同数据类型的数据 集合特点:大小可动态扩展,可以存储各种类型的数据   转换 数组转换为集合: A ...

  9. qtp 自动化测试---点滴 获取属性性/修改窗体标题

    1 GetROProperty获取对应属性值 value url (这里出错了) If Window("新增").WinObject("TRzDBEdit_10" ...

  10. How to remove ROM in MAME

    /usr/share/games/mame/roms/ /usr/local/share/games/mame/roms/ sudo rm /usr/local/share/games/mame/ro ...