ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

带分数--第四届蓝桥杯省赛C++B/C组

2022-02-21 10:34:43  阅读:173  来源: 互联网

标签:use return -- had 带分数 蓝桥 int include ever


第四届蓝桥杯省赛C++B/C组----带分数

思路:

1.先枚举全排列
2.枚举位数
3.判断是否满足要求
这道题也就是n=a+b/c,求出符合要求的abc的方案数。进行优化时,可以对等式进行改写,改写成:b=cn-ca。

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

const int N = 30;
int target,ans = 0;
bool had_use[N],ever[N];

bool check(int a, int c)
{
    int b = c*target - c*a; //写出式子,算出b
    if (!a || !b || !c) return false;
    memcpy(ever, had_use, sizeof had_use); //拷贝had_use数组给ever,这样能不改变原来的数组
    while (b)
    {
        int t = b % 10;
        if (!t || ever[t]) return false;
        ever[t] = true;
        b /= 10;
    }
    for (int i = 1; i <= 9; i++)//判断1-9每个数字有没有都被用到
        if (!ever[i])   return false;
    return true;
}

void dfs_c(int x, int a, int c)//x表示用了多少个数字,a表示枚举的a的大小,c表示c的大小
{
    if (x >= 10)    return;//如果1-9全部都已经被枚举了,则退出
    if (check(a,c)) ans++; //检验a和c是否满足要求,满足则方案书+1
    for (int i = 1; i <= 9; i++)
    {
        if (!had_use[i])
        {
            had_use[i] = true;
            dfs_c(x+1, a, c*10+i);
            had_use[i] = false;
        }
    }
}

void dfs_a(int u, int a)//u表示枚举到第几个位置,也就是用了多少个数字,t表示当前的a是多少
{
    if (a >= target) return;
    if (a) dfs_c(u, a, 0); //如果a满足要求,则对c进行枚举
    
    for (int i = 1; i <= 9; i++)
    {
        if (!had_use[i])
        {
            had_use[i] = true;
            dfs_a(u+1, a * 10 + i);//将i加在a的各位
            had_use[i] = false; //回溯,恢复现场
        }
    }
    
}
int main()
{
    scanf("%d", &target);
    dfs_a(0,0); //先枚举a
    printf("%d", ans);
    return 0;
}

标签:use,return,--,had,带分数,蓝桥,int,include,ever
来源: https://www.cnblogs.com/banyan-1030/p/15917745.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有