问题描述

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. Windows环境下手动更新boot2docker.iso

    GitHub连不上导致自动更新失败. https://github.com/boot2docker/boot2docker/releases 替换了DockerToolbox安装目录和系统盘用户目录\ ...

  2. logging.basicConfig参数简介

    通过logging.basicConfig函数对日志的输出格式及方式做相关配置 import logging logging.basicConfig(level=logging.DEBUG, form ...

  3. java-信息安全(十八)java加密解密,签名等总结

    一.基本概念 加密: 密码常用术语: 明文,密文,加密,加密算法,加密秘钥,解密,解密算法,解密秘钥, 密码分析:分析密文从而推断出明文或秘钥的过程 主动攻击:入侵密码系统,采用伪造,修改,删除等手段 ...

  4. 谈谈ConcurrentHashMap1.7和1.8的不同实现

    知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得. ConcurrentHashMap 在多线程环境下,使用HashMap进行put操作时存在丢失数据的情况,为了避免这种bug的隐患,强烈 ...

  5. ubuntu16.04 安装指定版本Node,升级npm到指定版本

    一.安装配置Node 1.下载(64位系统) wget https://nodejs.org/download/release/v10.1.0/node-v10.1.0-linux-x64.tar.g ...

  6. Linux系统——DNS

    DNS系统的作用1. DNS服务器Internet中,大部分网站.邮件服务等服务器都使用了域名形式的地址,这种地址形式要比使用IP地址形式更加直观,更加容易被用户记住.FQDN格式(完整域名格式):在 ...

  7. JAVA构建高并发商城秒杀系统——架构分析

    面试场景 我们打算组织一个并发一万人的秒杀活动,1元秒杀100个二手元牙刷,你给我说说解决方案. 秒杀/抢购业务场景 商品秒杀.商品抢购.群红包.抢优惠劵.抽奖....... 秒杀/抢购业务特点 秒杀 ...

  8. Spring的一些面试题(转)

    一.spring工作原理: 1.spring mvc的所有请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作.2.DispatcherServlet ...

  9. bzoj1605 / P2905 [USACO08OPEN]农场危机Crisis on the Farm

    P2905 [USACO08OPEN]农场危机Crisis on the Farm 发现总步数$k<=30$,考虑用$k$瞎搞 设$f[u][i][j]$表示已经吹$u$次哨,全体奶牛向右走$i ...

  10. Java编程学习之JDBC连接MySQL

    JDBC连接MySQL 一.对JDBC连接数据库的步骤1.加载数据库驱动//加载驱动Class.forName(driverClass)-------------------------------- ...