首页 > 其他分享 >蓝桥杯-带分数

蓝桥杯-带分数

时间:2024-05-06 21:33:52浏览次数:19  
标签:int 样例 back 带分数 蓝桥 100 st

100 可以表示为带分数的形式:100 = 3 + 69258/714
还可以表示为:100 = 82 + 3546 / 197
注意特征:带分数中,数字 1∼9 分别出现且只出现一次(不包含 0)。

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

输入格式

一个正整数。

输出格式

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

数据范围

1≤N<1e6

输入样例1:

100

输出样例1:

11

输入样例2:

105

输出样例2:

6

题解:

  • 枚举所有 a 的情况, 在每种 a 的前提下, 再枚举所有 c 的情况
  • 根据 a, c, n 计算出 b
  • 判断是否满足 [1, 9] 仅出现过一次, 且 a, b, c中不含有0

代码并不是很长, 去除空行大概有五十行, 大家耐心看, 代码中有很多注释, 如果有不理解的地方可以再问~

#include <bits/stdc++.h>
using namespace std;
const int N = 20;
int n, ans;
bool st[N], back[N];

bool check(int a, int c)
{
    int b = n * c - a * c;  // 公式: n = a + b / c  ==> b = n * c - a * c

    if (!a || !b || !c) return false;  //  会把 a b c 任意一个等于 0 的情况给筛掉

    memcpy(back, st, sizeof st);    // 赋值st的状态, 用于判断 [1, 9] 是否全出现过
    while (b)
    {
        int x = b % 10;     // 取个位
        b /= 10;    // 个位删掉
        if (!x || back[x]) return false;  // 保证 b 中不含 0, 同时 保证 [1, 9] 只出现过一次
        back[x] = true;
    }
    for (int i = 1; i <= 9; i ++) if (back[i] == false) return false;
    return true;
}

void dfs_c(int u, int a, int c)
{
    if (check(a, c)) ans ++;  //  这里同样可以不用管 c 是否为 0, check函数中有 处理 c 等于 0 的情况

    for (int i = 1; i <= 9; i ++)
    {
        if (st[i]) continue;
        st[i] = true;
        dfs_c(u + 1, a, c * 10 + i);
        st[i] = false;
    }
}

void dfs_a(int u, int a)  // 枚举 a 的所有可以能 (1, 12, 123, ... 987654321)
{
    if (a > n) return;   // 剪枝, a > n的时候 b,c没有满足条件的值 (没有这个也不会死循环, 有这个可以减少代码运行的时间)

    if(a != 0) dfs_c(u, a, 0);  // 这和判断可以写, 也可以不写, 写的话运行时间会快一些, 不写的话在check函数中对 等于 0 进行的处理
    
    for (int i = 1; i <= 9; i ++)  
    {
        if (st[i]) continue;
        st[i] = true;
        dfs_a(u + 1, a * 10 + i);
        st[i] = false;
    }
}

int main()
{
    cin >> n;
    
    dfs_a(0, 0);
    
    cout << ans << endl;
    return 0;
}

觉得写的不错的话, 点个赞吧~

标签:int,样例,back,带分数,蓝桥,100,st
From: https://www.cnblogs.com/xxctx/p/18175981

相关文章

  • 蓝桥杯-四平方和
    四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和。如果把0包括进去,就正好可以表示为4个数的平方和。比如:5=0^2+0^2+1^2+2^27=1^2+1^2+1^2+2^2对于一个给定的正整数,可能存在多种平方和的表示法。要求你对4个数排序:0≤a......
  • 蓝桥杯-k倍区间
    给定一个长度为N的数列,A1,A2,…AN,如果其中一段连续的子序列Ai,Ai+1,…Aj之和是K的倍数,我们就称这个区间[i,j]是K倍区间。你能求出数列中总共有多少个K倍区间吗?输入格式第一行包含两个整数N和K。以下N行每行包含一个整数Ai。输出格式输出一个整数,代表K倍......
  • 蓝桥杯-分巧克力
    儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有N块巧克力,其中第i块是Hi×Wi的方格组成的长方形。为了公平起见,小明需要从这N块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足:形状是正方形,边长是整数大小相同......
  • 2024第十五届蓝桥杯网络安全赛项部分题目 WriteUp
    2024第十五届蓝桥杯网络安全赛项部分题目WriteUp爬虫协议根据提示,访问/robots.txt,得到敏感路径/38063b612387b10e22f4bd0d71a46a4e/,访问其中的/9de33df789dc91e984a091e6dce2dfb1得到flag。flag{494547b4-f13f-47de-b1a5-a99f20495cd7}packet使用过滤器tcpcontains"fla......
  • 第十五届蓝桥杯 网络安全赛道 ezjava
    1.前言前一秒还在robots.txt找flag,下一秒就java内存马了,还不出网,这很......
  • 蓝桥杯-数的划分(DFS)
    0.题目问题描述将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。例如:n=7,k=3,下面三种分法被认为是相同的。1,1,5;1,5,1;5,1,1;问有多少种不同的分法。输入格式n,k输出格式一个整数,即不同的分法样例输入73样例输出4数据......
  • 2024蓝桥杯省赛C/C++程序设计A组题目简析
    2024蓝桥杯省赛C/C++程序设计A组题目简析A题意:计算一段区间内日期的中文表达的总笔画数>50的天数按照题意枚举即可。注意个位数字前面需要加一个“零”,也就是多13笔。B题意:\(5\times5\)的棋盘下五子棋,最终下满棋盘并和棋的情况数dfs或者遍历二进制去枚举棋子位置的情况均可......
  • 【2024蓝桥B组】好数
    好数题目 题目分析1.蓝桥杯不怕麻烦的,一般可以选择用longlongint替换int,防止数据过大2.这道题不怕麻烦的话,可以直接暴力解,用多个if语句进行判断即可3.想要美观点的,就进行数位判断4.这道题就一个关键点:奇数位对奇数,偶数位对偶数代码1#include<iostream>usingname......
  • 第十五届蓝桥杯大赛软件赛省赛 C/C++ 大学 A 组
    Preface答辩圈钱杯,去年省赛的题好歹还有些有意思的题(指杜教筛),今年变成煞笔题开会了是吧两个小时多一点就全写完了,然后开始给后面三题写对拍(结果发现其实都没写挂纯在浪费时间)考完感觉AK有望,结果后面发现最后一题漏看条件了,苦露西而且中间EF两题全偷懒开__int128了,反正用下发的......
  • 【2024蓝桥B组】小球反弹
    小球反弹题目题目分析一个比较绕脑的数学问题。。。首先:小球能过从左上角出发,然后回到左上角,那么其x方向的路径长度则为2k1x,y方向的路径长度则为2k2y。其次,我们得知其x与y的速度比值为15:17,由公式:时间*速度=路程可得:t*dx=2k1x,t*dy=2k2y然后,通过简单的数学变换,我们可以得出:k......