1 条题解

  • 0
    @ 2025-8-24 22:42:58

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar H17
    * *

    搬运于2025-08-24 22:42:58,当前版本为作者最后更新于2022-11-23 10:09:23,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    思路分析

    这道匹配的题,可以让数据选择设备,并且标记上这个设备已经被匹配了。

    我们可以使用深度优先搜索实现,把每一种合法排列搜索一遍,第一次输出并标记上,后面搜到就不输出,然后如果没有则输出 -1

    代码实现

    #include<bits/stdc++.h>
    using namespace std;
    int n,k,a[7],b[7],p[7];
    //按题目名称定义变量&数组
    bool f=1,u[7];
    //f用来判断是不是最小的全排列,u数组用来判断是否被使用过
    void dfs(int s){
        if(s==k+1){
            if(f)
                for(int i=1;i<=n;i++)
                    printf("%d ",p[i]);
            //字典序最小
            f=0;
            //标记
            return;
        }
        //边界
        for(int i=1;i<=n;i++)
            if(a[i]-b[s]>=0/*够用*/&&!u[i]/*没用过*/){
                p[s]=i,u[i]=1;
                dfs(s+1);
                u[i]=0;
                //标记是否使用过
            }
            //让每次数据匹配一个机器
        return;
    }
    int main(){
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)
            scanf("%d",a+i);
        for(int i=1;i<=k;i++)
            scanf("%d",b+i);
        //输入
        dfs(1);
        //深度优先搜素
        if(f)
            puts("-1");
        //没有输出-1
        return 0;
    }
    
    • 1

    信息

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