问题描述

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
 
首先是暴力,TLE ,33分,讲道理我还想不到好嘛。
 // 纯纯的暴力 挂了。
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std; int vis[], visall[]; bool check(int num) {
while(num) {
int temp = num % ;
if (vis[temp]) return false;
if (temp == ) return false;
vis[temp]++;
num /= ;
}
return true;
} bool checkAll() {
for (int i=; i<; ++i) {
if (vis[i] != ) return false;
}
return true;
} void copyNum(int a[], int b[]) {
for (int i=; i<; ++i) {
a[i] = b[i];
}
} int main() {
int n;
while(cin >> n) {
memset(vis, , sizeof(vis));
memset(visall, , sizeof(visall));
int ans = ; for (int l=; l<n; ++l) {
memset(vis, , sizeof(vis));
if (!check(l)) continue;
copyNum(visall, vis); for (int down=; down<; ++down) {
int up = (n-l) * down;
if (down > up) continue;
if (up % down) continue;
copyNum(vis, visall);
if (!check(down) || !check(up)) {
continue;
}
if (checkAll()) {
//cout << l << " " << down << " " << up << endl;
ans++;
}
}
} cout << ans << endl;
}
return ;
}

然后是优化。依然感觉dfs好神奇的说。

 /*
刚才暴力的优化吧。
先遍历左边的数字,然后dfs搜分母对应的长度 和 数字。
*/ #include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std; int lens, v, ans;
int vis[], visall[]; bool check(int num) {
int k = ;
while(num) {
int temp = num % ;
if (vis[temp]) return false;
vis[temp]++;
k++;
num /= ;
}
lens = -k; // 剩余可用数字的个数
return true;
} void copyVis() {
for (int i=; i<; ++i) {
visall[i] = vis[i];
}
} int judge(int up) { // fenmu
int k = ;
copyVis();
while(up) {
int temp = up % ;
if (visall[temp]) return -;
visall[temp] = ;
k++;
up /= ;
}
return k;
} void dfs(int len, int val) { // len fenzi
if (len > lens/) return;
if (judge(v*val) == lens-len) ans++;
for (int i=; i<; ++i) {
if (vis[i]) continue;
vis[i] = ;
dfs(len+, val*+i);
vis[i] = ;
}
} int main() {
int n;
while(cin >> n) {
ans = ;
for (int l=; l<n; ++l) {
memset(vis, , sizeof(vis));
vis[] = ;
if (!check(l)) continue;
v = n - l;
dfs(, ); // len fenmu
}
cout << ans << endl;
}
return ;
}

然后还有一种思路就是,对九个数字实现全排列,然后从八个空里找两个放+ 和 /。讲道理,这样的话,时间复杂度是10^6*8*7 不知道能不能过.....

蓝桥杯练习系统历届试题 带分数 dfs的更多相关文章

  1. 蓝桥杯练习系统历届试题 剪格子 dfs

    问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+|10* 1|52|+--****--+|20|30* 1|*******--+| 1| 2| 3|+--+--+--+ ...

  2. 蓝桥杯练习系统—基础练习 2n皇后问题

    问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后, 使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行. 同一列或 ...

  3. [18/12/3]蓝桥杯 练习系统 入门级别 Fibonacci数列求模问题 题解思路

    前言略. 看到这个题目本来应该很高兴的,因为什么,因为太TM的基础了啊! 可是当你用常规方法尝试提交OJ时你会发现..hhh...运行超时..(开心地摇起了呆毛 //Fibonacci数列递归一般问题 ...

  4. 蓝桥杯之剪格子(经典dfs)

    如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+--+-- ...

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

      历届试题 地宫取宝   时间限制:1.0s   内存限制:256.0MB      问题描写叙述 X 国王有一个地宫宝库. 是 n x m 个格子的矩阵. 每一个格子放一件宝贝. 每一个宝贝贴着价 ...

  6. Java实现 蓝桥杯 历届试题 带分数

    问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次( ...

  7. 算法笔记_197:历届试题 带分数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. ...

  8. 第六届蓝桥杯B组C++试题

    1.  奖券数目 有些人很迷信数字,比如带"4"的数字,认为和"死"谐音,就觉得不吉利. 虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖券号 ...

  9. 36-2018 蓝桥杯Java B组试题及答案

    1:第几天2000年的1月1日,是那一年的第1天.那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数,不要填写任何多余内容. 用excel算,答案125. 2.标题:方格计数 ...

随机推荐

  1. FPN(feature pyramid networks)

    多尺度的object detection算法:FPN(feature pyramid networks). 原来多数的object detection算法都是只采用顶层特征做预测,但我们知道低层的特征 ...

  2. Python开发【Django】:重构Admin

    自定义KingAdmin 通过admin样式自己做KingAdmin 提前需知道的model操作 # 获取app名 >>> models.Customer._meta.app_lab ...

  3. uva 11105 - Semi-prime H-numbers(数论)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u011328934/article/details/36644069 option=com_onli ...

  4. Spring源码解析(四)Bean的实例化和依赖注入

    我们虽然获得了Bean的描述信息BeanDefinition,但是什么时候才会真正的实例化这些Bean呢.其实一共有两个触发点,但是最后实际上调用的是同一个方法. 第一个:在AbstractAppli ...

  5. Spring源码解析(五)循环依赖问题

    引言 循环依赖就是多个类之间互相依赖,比如A依赖B,B也依赖A,如果日常开发中我们用new的方式创建对象,这种循环依赖就会导致不断的在创建对象,导致内存溢出. Spring是怎么解决循环依赖的问题的? ...

  6. Java8新特性(转载)

    1.Lambda表达式 Lambda表达式(也称为闭包)是整个Java 8发行版中最受期待的在Java语言层面上的改变.使用 Lambda 表达式可以使代码变的更加简洁紧凑. Lambda允许把函数作 ...

  7. Java基础方法

    1:读取resource下面的文件 ClassPathResource cpr = new ClassPathResource("./MyBatisXmlFile"); File ...

  8. spring登录验证拦截器和根据用户角色登录

    大家都知道spring的用户登录拦截器,确实省去了程序员不少的精力,下面说说我在项目中使用的感受. 德安微信管理后台是管理多个微信帐号的平台,登录到平台的用户有三个角色,游客和微信帐号管理员.超级管理 ...

  9. HDU1695:GCD(容斥原理+欧拉函数+质因数分解)好题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题目解析: Given 5 integers: a, b, c, d, k, you're to ...

  10. Java转Exe

    1.Jsmooth Java文件打包成exe文件(可以在没安装JDK的环境下运行):http://www.tuicool.com/articles/byIFJn 2.用JSmooth制作java ja ...