带分数(dfs,next_permutation)
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。
还可以表示为:100 = 82 + 3546 / 197。
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
从标准输入读入一个正整数N (N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
#include<iostream>
#include <algorithm>
using namespace std; int sum(int start,int end,int a[])
{
int i,sum=0;
for(i=start; i<end; i++)
sum=sum*10+a[i];
return sum;
} int main()
{
int m,aws=0,a[10];
int i,j; scanf("%d",&m);
for(i=0; i<9; i++)
a[i]=i+1;
do
{
for(i=1; i<10; i++)
{
int m1=sum(0,i,a);
if(m1>=m)
continue; //不满足条件直接跳过
for(j=i+(10-i)/2; j<9; j++) //从第一个数用过的数后开始
{
int m2=sum(i,j,a);
int m3=sum(j,9,a);
if(m2%m3==0&&m==m1+m2/m3)
{
aws++; // 统计符合条件的
}
}
}
}
while(next_permutation(a, a+9)); //枚举全排列
printf("%d",aws);
return 0;
}
其中next_permutation函数部分可以用dfs代替,代码如下:(关于用dfs实现全排列的思想请见链接:http://www.cnblogs.com/curo0119/p/8414195.html)
#include<cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int flag[11]={0};
int a[11];
int ncount=0;
int pp=0;
int getSum(int start,int end,int a[])
{
int sum=0;
for(int i=start;i<end;i++)
{
sum=sum*10+a[i];
}
return sum;
}
void Found(int a[],int n)
{
int re1,re2,re3;
re1=0;
re2=0;
re3=0;
for(int i=1;i<10;i++)
{
re1=getSum(0,i,a);
if(re1>=n) continue;
for(int j=i+(10-i)/2;j<9;j++)
{
re2=getSum(i,j,a);
re3=getSum(j,9,a);
if(re2>re3&&re2%re3==0&&n==re1+re2/re3)
{
ncount++;
}
}
}
}
void DFS(int start,int m)//对1~9进行全排列
{
int i;
if(start==9)
Found(a,m); //每排好一个序列调用一次该函数,判断是否满足等式
else
{
//排序列
for(i=1; i<10; i++)
{
if(!flag[i])
{
a[start]=i;
flag[i]=1; //标记是否用过
DFS(start+1,m);//选择好一位开始选下一位
flag[i]=0;//根据递归函数的压栈过程,把当前序列已经标记过的解除标记(从0到9全解除后再进入下一次序列的生成)
} //当返回上一级的dfs的时候,会接着执行下面的语句,不会重复调用dfs了(函数的压栈过程)
}
}
} int main()
{
int n;
scanf("%d",&n);
int i,j;
int a[10]; for(i=0;i<9;i++)
{
a[i]=i+1;
}
DFS(0,n);
printf("%d",ncount);
return 0;
}
本文转载于:http://blog.csdn.net/zhangffyy/article/details/54952548
带分数(dfs,next_permutation)的更多相关文章
- 蓝桥杯 带分数 DFS应用
问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次( ...
- 三羊献瑞:dfs / next_permutation()
三羊献瑞 观察下面的加法算式: 祥 瑞 生 辉 + 三 羊 献 瑞------------------- 三 羊 生 瑞 气 (如果有对齐问题,可以参看[图1.jpg]) 其中,相同的汉字代 ...
- 蓝桥杯练习系统历届试题 带分数 dfs
问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次( ...
- 洛谷 P1618 三连击(升级版)【DFS/next_permutation()/技巧性枚举/sprintf】
[链接]:https://www.luogu.org/problemnew/show/P1618 题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试 ...
- 带分数dfs+剪枝优化
#include<iostream>#include<cstdio>#include<cstdlib>#include<ctime>using name ...
- 2015第六届蓝桥杯C/C++ B组
奖券数目:枚举 有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利.虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖券号码是5位数(10000-99999),要求其 ...
- HDU1027 Ignatius and the Princess II 【next_permutation】【DFS】
Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ( ...
- 蓝桥杯 算法提高 3000米排名预测 DFS 递归搜索 next_permutation()使用
#include <iostream> #include <algorithm> #include <queue> #include <cstring> ...
- 蓝桥杯 - 带分数 (DFS)
历届试题 带分数 时间限制:1.0s 内存限制:256.0MB 问题描写叙述 100 能够表示为带分数的形式:100 = 3 + 69258 / 714. 还能够表示为:10 ...
随机推荐
- chrome谷歌浏览器用这种方式清除缓存比较方便了,必须是调试模式才行
chrome谷歌浏览器用这种方式清除缓存比较方便了 PS:必须是调试模式才行,可以不是手机模式 ,有些低版本浏览器可能没有这个功能. ----------------------------- ...
- Socket和ServletSocket的交互
ServerSocket(int port) 是服务端绑定port端口,调accept()监听等待客户端连接,它返回一个连接队列中的一个socket. Socket(InetAddress addre ...
- 轻量级文本标记语言-Markdown
Markdown简介 接触过github的都知道,在发布项目的时候可以建立一个说明文件README.md,这个md文件就是Markdown文本编辑语言的文件. Markdown 是一种轻量级标记语言, ...
- 基于Swoole和Redis实现的并发队列处理系统
背景 由于PHP不支持多线程,但是作为一个完善的系统,有很多操作都是需要异步完成的.为了完成这些异步操作,我们做了一个基于Redis队列任务系统. 大家知道,一个消息队列处理系统主要分为两大部分:消费 ...
- 20135234mqy-——信息安全系统设计基础第十一周学习总结
第八章 异常控制流 8.1异常 异常是异常控制流的一种形式,它一部分是由硬件实现的,一部分是由操作系统实现的. 异常就是控制流中的突变,用来响应处理器状态中的某些变化. 8.1.1异常处理 异常号是到 ...
- Disruptor学习笔记(一):基本原理和概念
一.Disruptor基本原理 在多线程开发中,我们常常遇到这样一种场景:一些线程接受用户请求,另外一些线程处理这些请求.比如日志处理中的日志输入和告警.这种典型的生产者消费者场景十分常见,而生产者消 ...
- intent bundle的使用
1.什么是bundle Bundle主要用于传递数据:它保存的数据,是以key-value(键值对)的形式存在的.我们经常使用Bundle在Activity之间传递数据,传递的数据可以是boolean ...
- Python3基础 list reversed 列表逆转并输出
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- 第几天|2018年蓝桥杯B组题解析第一题-fishers
标题:第几天 2000年的1月1日,是那一年的第1天. 那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数,不要填写任何多余内容. 思路:计算日期,用excel计算两个日期的差 ...
- LightOJ 1296 Again Stone Game(sg函数)题解
题意:每次必须拿且只能拿不超过一半的石头,不能拿为败 思路:显然算出每个的sg函数,但是范围1e9显然不能直接打表.所以先打表找规律,发现偶数一直是自己的一半,奇数好像没规律.偶数x的sg函数值是x/ ...