1 条题解

  • 0
    @ 2025-8-24 21:25:30

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar john666
    这个家伙懒得很,什么都没留下!

    搬运于2025-08-24 21:25:29,当前版本为作者最后更新于2017-10-17 17:23:46,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    速度很快的:

    分析:

    1、搜索对象为符号位,共n-1个;

    2、搜索状态search(int k,int s,int q,char c);

    对于每数字后面可加的符号有空格、+、-三种;

    k为第几个,s为当前总和,q为待处理的前一个数值,c为最后一个非空格符号;

    3、搜索条件:分别搜索三种符号所得的表达式的和,当k=n且和为0时输出;

    4、返回处理:每次返回时需要从上一个数开始向下搜索。

    详见代码:


    #include<bits/stdc++.h>//john.c_Tae Yeon
    #define sea 1000500
    using namespace std;
    int n,sz[20],ss;
    char symbol[20];
    void sear(int k,int s,int q,char c){
        if(k==n){
            if(c=='+'){
                s=s+q;
            }
            else{
                s=s-q;
            }
            if(s==0){
                ss++;
                cout<<"1";
                for(int i=1;i<n;i++){
                    cout<<symbol[i]<<sz[i];
                }
                cout<<" "<<ss<<endl;
            }
        }
        else{
            symbol[k]=' ';
            sear(k+1,s,q*10+sz[k],c);
            symbol[k]='+';
            if(c=='+'){
                sear(k+1,s+q,sz[k],'+');
            }
            else{
                sear(k+1,s-q,sz[k],'+');
            }
            symbol[k]='-';
            if(c=='+'){
                sear(k+1,s+q,sz[k],'-');
            }
            else{
                sear(k+1,s-q,sz[k],'-');
            }
        }
    }
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++){
            sz[i]=i+1;
        }
        sear(1,0,1,'+');
        return 0;
    }
    
    • 1

    信息

    ID
    466
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者