蓝桥杯 - 带分数 (DFS)

历届试题 带分数

时间限制:1.0s   内存限制:256.0MB

问题描述

100 可以表示为带分数的形式:100 = 3 + 69258 / 714。

还可以表示为:100 = 82 + 3546 / 197。

注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。

类似这样的带分数,100 有 11 种表示法。

输入格式

从标准输入读入一个正整数N (N<1000*1000)

输出格式

程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。

注意:不要求输出每个表示,只统计有多少表示法!

样例输入1

100

样例输出1

11

样例输入2

105

样例输出2

6

思路:简单DFS,先枚举整数部分,然后再DFS枚举分母即可

AC代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

int flag[20], n;
int ans;
int ll;//ll为去掉整数位数而剩下的位数
int v;//v为分数的整数值)  

int fun(int x) {
	int len = 0;
	while(x) {
		int t = x % 10;
		if(flag[t]) return 0;
		flag[t] = 1;
		x /= 10;
		len++;
	}
	ll = 9 - len;
	return 1;
}

int judge(int x, int l) {
	int len = 0;
	int a[20];
	memcpy(a, flag, sizeof(flag));
	while(x) {
		int t = x % 10;
		if(a[t]) return 0;
		a[t] = 1;
		x /= 10;
		len ++;
	}
	int ff = 1;
	for(int i = 1; i < 10; i++) {//看数字1到9是否都用到了
		if(a[i] == 0) ff = 0;
	}

	if(ff && len == ll - l) return 1;
	return 0;
}

void dfs(int len, int x) {	//len为此时分母所占的位数,x为分母
	if(len <= ll / 2) {
		if(judge(v * x, len)) //v*x为分子
			ans ++;
		for(int i = 1; i < 10; i++) {
			if(flag[i]) continue;
			flag[i] = 1;
			dfs(len + 1, x * 10 + i);
			flag[i] = 0;
		}
	}
}

int main() {
	while(cin >> n) {
		ans = 0;
		for(int i = 1; i < n; i++) {
			memset(flag, 0, sizeof(flag));
			if(fun(i)) {
				v = n - i;
				dfs(0, 0);
			}
		}

		cout << ans << endl;
	}
	return  0;
}
时间: 2024-08-06 11:33:40

蓝桥杯 - 带分数 (DFS)的相关文章

蓝桥杯 带分数 (JAVA版)

最近都忙着炒股,好久没写博客了,蓝桥杯决赛在即,今天必须来一发了 测评链接:http://lx.lanqiao.org/problem.page?gpid=T26 问题描述: 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0). 类似这样的带分数,100 有 11 种表示法. 输入格式 从标准输入读入一个正整数N (N<1000*1000) 输出格

[蓝桥杯]带分数

题目链接:http://lx.lanqiao.cn/problem.page?gpid=T26 题目大意:1~9在a,b,c中出现且仅出现一次,要求输入n,输出符合要求的(a,b,c)的解的个数. 关键思想:a,b,c相连其实就是一个排列,只要将该排列依次分割成两部分就可以了.还可以剪枝:显然n>a,那么n的位数也大于等于a的位数:因为b要整除c,所以b的位数肯定大于等于c. 代码如下: #include <iostream> #include <string> #inclu

蓝桥杯——历年真题之带分数

问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0). 类似这样的带分数,100 有 11 种表示法. 输入格式 从标准输入读入一个正整数N (N<1000*1000) 输出格式 程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数. 注意:不要求输出每个表示,只统计有多少表示法! 样例输入1 100 样例输出1 11 样例输入

蓝桥杯 地宫寻宝 带缓存的DFS

最近一个问题很困扰我,今天则得到了答案,也意味着我该选择了. 不知道大家有没有遇到过这样的情况,我是上年刚毕业,大四时进行过java培训,12年9月-13年4月,在这之前已经自学过java.7月份时进入一家公司工作,今年3月份辞职,4月份找到工作,来上班了.一开始就不太喜欢公司氛围,前台,hr,态度什么的都不太好,工作环境也极像客服部,整天电话不断,讨论声不断,第一个星期真是煎熬,去了两三天之后有辞职的想法,但是后面想想还是算了,公司待遇还可以. 但是进入到公司后leader让学PHP,学PHP

【蓝桥杯】带分数

100 可以表示为带分数的形式:100 = 3 + 69258 / 714 还可以表示为:100 = 82 + 3546 / 197 注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0). 类似这样的带分数,100 有 11 种表示法. 题目要求: 从标准输入读入一个正整数N (N<1000*1000) 程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数. 注意:不要求输出每个表示,只统计有多少表示法! 例如: 用户输入: 100 程序输出: 11 再例如: 用户输入:

算法-蓝桥杯习题(六)

蓝桥杯习题 蓝桥杯练习系统习题加答案,总共分为6部分,90%习题使用C语言解答,部分使用C++或者Java.大部分习题为搜索参考或者别人提供所得,不足之处在所难免,恳请批评指正(预计200多题,习题仅供学习交流) 目录 算法训练(详见 算法-蓝桥杯习题(一))Go 算法训练(详见 算法-蓝桥杯习题(二))Go 算法提高(waiting...) 历届试题(详见 算法-蓝桥杯习题(六))Go 历届试题(详见 算法-蓝桥杯习题(七))Go 蓝桥杯练习系统评测数据 链接: http://pan.baid

蓝桥杯练习系统题解

转于:http://www.cnblogs.com/cshhr/p/3550014.html 蓝桥杯官网练习系统题解(非VIP) BEGIN-4(Fibonacci数列) 有递推公式,大家都知道用递推公式求,仅仅要记得在递推的时候同一时候取模求好 这里给一份另类代码,用矩阵高速幂求,事实上还有循环节 /* (1 1) * (Fn-1) = ( Fn )//矩阵相乘,将就着看吧 (1 0) (Fn-2) (Fn-1) (1 1) * (1 1) * (Fn-2) = ( Fn ) (1 0) (1

2015年蓝桥杯省赛B组C/C++(试题+答案)

首先说,这次我是第二次参加蓝桥杯(大学里最后一次),可这次去连个三等都没拿到,有些心灰意冷,比上一次还差, 当时看到成绩出来的时候有些失落,但是跌倒了,再站起来继续跑就可以了.可能是状态不好吧,纯属自我安慰. 接下来我把今年的题目又重新做了一遍,写下了这篇博客,如果也有需要探讨答案的,希望可以有帮助. 第一题: 第1题:统计不含4的数字 题目大意 统计10000至99999中,不包含4的数值个数. 解题分析: 第一种解法: 数学方法,这种是在网上看到的一种解法: 最高位除了0.4不能使用,其余8

蓝桥杯——算法训练之乘积最大

问题描述 今年是国际数学联盟确定的"2000--世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加.活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大. 同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子: 有一个数字串:312, 当N=3,K=1时