zoukankan      html  css  js  c++  java
  • 蓝桥杯之带分数(全排列+暴力)

    Description

    100 可以表示为带分数的形式:100 = 3 + 69258 / 714。

    还可以表示为:100 = 82 + 3546 / 197。

    注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。

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

    Input

    从标准输入读入一个正整数N (N<1000*1000)

    Output

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

    Sample Input

    样例输入1
    100
    
    样例输入2
    105
    

    Sample Output

    样例输出1
    11
    
    样例输出2
    6

    题目链接:https://acmore.cc/problem/LOCAL/1596

    分析:
    因为每个数字只使用一次,要求x+y/z==n
    所以在1-9的全排列中
    对每个全排列分成3段,对应x,y,z
    如果满足等式则该全排列的该种分段方式符合要求

    直接暴力即可。。。。

    code:
    #include<bits/stdc++.h>
    using namespace std;
    int a[10];
    int f(int k1,int k2,int k3,int n)
    {
        int x=0,y=0,z=0;
        int temp=1;
    
        for(int i=1;i<=k1-1;i++)
            temp*=10;
        for(int i=1;i<=k1;i++)
            x+=(a[i]*temp),temp/=10;
    
        temp=1;
        for(int i=1;i<=k2-1;i++)
            temp*=10;
        for(int i=k1+1;i<=k1+k2;i++)
            y+=(a[i]*temp),temp/=10;
    
        temp=1;
        for(int i=1;i<=k3-1;i++)
            temp*=10;
        for(int i=k1+k2+1;i<=k1+k2+k3;i++)
            z+=(a[i]*temp),temp/=10;
        if(y%z==0)
        {
            if(x+y/z==n)
            {
    
                //cout<<x<<" "<<y<<" "<<z<<endl;
                return 1;
            }
        }
        return 0;
    }
    void pr()
    {
        for(int i=1;i<=9;i++)
            cout<<a[i];
        cout<<endl;
    }
    int main()
    {
        for(int i=1;i<=9;i++)
            a[i]=i;
        int n;
        cin>>n;
        int c=0;
        for(int i=1;i<=7;i++)
        {
            for(int j=1;j<=7;j++)
            {
                if(i+j>=2&&i+j<=8)
                {
                    if(f(i,j,9-i-j,n))
                        c++;
                }
            }
        }
        while(next_permutation(a+1,a+1+9))
        {
           for(int i=1;i<=7;i++)
           {
               for(int j=1;j<=7;j++)
               {
                   if(i+j>=2&&i+j<=8)
                    {
                     if(f(i,j,9-i-j,n))
                        c++;
                    }
               }
           }
        }
        cout<<c<<endl;
        return 0;
    }
  • 相关阅读:
    HDU 4608 I-number
    hdu 4607 ( Park Visit )
    ZROI十一集训Day2
    CodeForces1230
    模拟退火
    ZROI#1007
    ZROI#1006
    ZROI#1005
    ZROI#1004
    ZROI#962
  • 原文地址:https://www.cnblogs.com/yinbiao/p/10479176.html
Copyright © 2011-2022 走看看