CodeForces - 95B(DFS)
题目链接: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)的更多相关文章
- codeforces 731C(DFS)
题目链接:http://codeforces.com/contest/731/problem/C 题意:有n只袜子(1~n),k种颜色(1~k),在m天中,左脚穿下标为l,右脚穿下标为r的袜子,问最少 ...
- CodeForces - 589J —(DFS)
Masha has recently bought a cleaner robot, it can clean a floor without anybody's assistance. Schema ...
- codeforces 723D(DFS)
题目链接:http://codeforces.com/problemset/problem/723/D 题意:n*m的矩阵中,'*'代表陆地,'.'代表水,连在一起且不沿海的水形成湖泊.问最少填多少块 ...
- CodeForces - 589J(DFS)
题目链接:http://codeforces.com/problemset/problem/589/J 题目大意:一个机器人打扫一个密闭的房间,房间由一个矩形构成,'*'表示家具,'.'表示该位置为空 ...
- Codeforces 761E(DFS)
E. Dasha and Puzzle time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces 115A- Party(DFS)
A. Party time limit per test 3 seconds memory limit per test 256 megabytes input standard input outp ...
- LeetCode Subsets II (DFS)
题意: 给一个集合,有n个可能相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: 看这个就差不多了.LEETCODE SUBSETS (DFS) class Solution { publ ...
- LeetCode Subsets (DFS)
题意: 给一个集合,有n个互不相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: DFS方法:由于集合中的元素是不可能出现相同的,所以不用解决相同的元素而导致重复统计. class Sol ...
- HDU 2553 N皇后问题(dfs)
N皇后问题 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 在 ...
随机推荐
- 【知乎】WinForm 与 WPF的区别
你想上班 那么针对公司需求学如果只是自己写着玩 那么区分一下1.你的程序运行在 自己机器a.一个工具而已 要的是cooooooool 那么WPFb.一个工具而已 要的是useful easy 那么wi ...
- 同一个机器 安装多个版本Chrome浏览器的方法
1. Chrome 现在安装直接没有任何提示 就直接安装了 而且自动式 高版本覆盖低版本安装 不给你任何选择版本的机会. 2. 但是chrome 的安装是基于用户的 所以 同一个机器 使用不同的用户 ...
- python数据结构与算法第十一天【希尔排序】
1.希尔排序的原理 2.代码实现 def shell_sort(alist): n = len(alist) # 初始步长 gap = n / 2 while gap > 0: # 按步长进行插 ...
- 多线程的实现方式01 Thread
/* * 多线程 有三种实现方式 * 其一 Thread * * 写一个类 * * 1.让他继承 Thread * 2.重写thread中的run方法 * 3.创建子类对象就是在 创建线程! * 3. ...
- 一、ABP框架框架摘要
ABP框架几点说明: 一.什么是ABP ABP是一个建立在最新的ASP.NET的MVC和Web API技术的应用框架.它可以很容易地使用依赖注入.日志记录.验证.异常处理.本地化等,也使用流行的框架和 ...
- Python——Label控件说明
Anchor : 标签中文本的位置: background(bg)foreground(fg) :背景色:前景色: borderwidth(bd) :边框宽度: width .height ...
- replace只能输入小数
case "checkPrice": tr.find(".layui-table-edit").keyup(function () { var $input = ...
- java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=fun2], {ExactMatcher:fDisplayName=fun2(cn.itcast.demo2.fun1)], {LeadingIdentifierMatcher:fClassName=cn.itcast.demo2.fun1,fLeadi
Junit报的错误, 在测试方法前面没有添加注解@Test
- gevent监测单线程下的io进行切换
from gevent import monkey;monkey.patch_all() import gevent import time def eat(name): print('%s eat ...
- JdbcTemplate的运用 (也是数据源的一种)