• 蓝桥杯 带分数 DFS应用


    问题描述

    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
     //法一
    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    using namespace std;
    
    int num[] = {1, 2, 3, 4, 5, 6, 7, 8, 9},
        N, ans;
    
    int getSum(int lh, int rh)
    {
        int sum = 0;
        for (int i = lh; i <= rh; i++)
        {
            sum = sum * 10 + num[i];
        }
        return sum;
    }
    
    void check()
    {
        for (int i = 0; i < 9; i++)
        {
            int a = getSum(0, i);
            if (a > N) continue;
            for (int j = i + 1; j < 8; j++)
            {
                int b = getSum(i + 1, j);
                int c = getSum(j + 1, 8);
                if (b >= c && b % c == 0 && (a + b/c == N)) {
                    ans++;
                }
            }
        }
    }
    
    void solve()
    {
        cin >> N;
        do {
            check();        
        } while(next_permutation(num, num + 9));
        printf("%d
    ", ans);
    }
    
    int main()
    {
        solve();
        return 0;
    }

     //法二

     1 #include <algorithm>
     2 #include <cstring>
     3 #include <queue>
     4 #define INF 0x3f3f3f3f
     5 #define MAXN 100005
     6 #define Mod 10001
     7 using namespace std;
     8 int vis[10], n , ans;
     9 int num[10];
    10 
    11 
    12 int getSum(int lh, int rh)
    13 {
    14     int sum = 0;
    15     for (int i = lh; i <= rh; i++) {
    16         sum = sum * 10 + num[i];
    17     }
    18     return sum;
    19 }
    20 
    21 void check()
    22 {
    23     for (int i = 1; i <= 9; i++) {
    24         int a = getSum(1, i);
    25         if (a > n) continue;
    26         for (int j = i + 1; j < 9; j++) {
    27             int b = getSum(i + 1, j);  //[i+1, j]
    28             int c = getSum(j + 1, 9);  //[j+1, 9]
    29             if (b >= c && b % c == 0 && a + b/c == n) {
    30                 ans++;
    31             }
    32         }
    33     }
    34 }
    35 
    36 void dfs(int step)
    37 {
    38     if (step == 10) {
    39         check();
    40     }
    41     else {
    42         for (int i = 1; i <= 9; i++) {
    43             if (!vis[i]) {
    44                 num[step] = i;
    45                 vis[i] = 1;
    46                 dfs(step + 1);
    47                 vis[i] = 0;
    48             }
    49         }
    50     }
    51     
    52 }
    53 
    54 int main()
    55 {
    56     scanf("%d", &n);
    57     ans = 0;
    58     memset(vis, 0, sizeof(vis));
    59     dfs(1);
    60     printf("%d
    ", ans);
    61     return 0;
    62 }
     //这里补充一个next_permutation()的用法
    //蓝桥杯 2015省赛 第3题 三羊献瑞
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    
    int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int b, c;
    int d;
    
    void solve()
    {
        do {
            b = a[0]*1000 + a[1]*100 + a[2]*10 + a[3];
            c = a[4]*1000 + a[5]*100 + a[6]*10 + a[1];
            d = a[4]*10000 + a[5]*1000 + a[2]*100 + a[1]*10 + a[7];
    //        if (b + c == d) {
    //            cout << b << " + " << c << " = " << d << endl;
    //        }
        } while (next_permutation(a, a + 10));
    }
    
    int main()
    {
        solve();
        return 0;
    }

    //发现好多蓝桥杯省赛的题目 都可以用 next_permutation()轻松解决..

    //还有之前整理的一个题目: http://www.cnblogs.com/douzujun/p/6669303.html

     
     
  • 相关阅读:
    学习PetShop3.0(9)工厂的资料
    net程序架构开发
    《解剖PetShop》系列之一
    与数据库相关的名词解释
    asp 导出Excel
    《解剖PetShop》系列之二
    业务模块的设计原则
    《解剖PetShop》系列之三
    JAVA之BigInteger(转)【转】【很好用啊】
    php_mcrypt.dll无法加载解决方法
  • 原文地址:https://www.cnblogs.com/douzujun/p/6551636.html
Copyright © 2020-2023  润新知