【蓝桥备赛】数字王国之军训排队——DFS深度优先搜索

题目链接

数字王国之军训排队

个人思路

一般最坏情况,就是这几个数都存在倍数关系,那么就是 n 个数分成 n 个队。然后本题 n 的范围不大,可以枚举 1 ~ n 得到,如果数字范围大可以考虑进行二分。从 1 ~ n ,第一次满足条件的队伍数,即答案,输出即可。

对于每一种队伍情况,使用dfs遍历每个数可以存放的队列,如果当前队列存在能被整除的数,则换下一个队;如果能放入当前队,则继续看下一个数。

先放入大的数,再放入小的数,肯定较小的数除以较大的数无法整除,所以需要先对数组排序。

cpp 复制代码
	for(int i = 1; i <= team; ++i)
    {
        int flag = 1;
        for(const auto j : record[i])
        {
            if(arr[x] % j == 0)
            {
                flag = 0;
                break;
            } 
        }
        if(flag)
        {
            record[i].push_back(arr[x]);
            if(dfs(x + 1, team))
                return true;
            record[i].pop_back();
        }
    }

参考代码

Java

java 复制代码
import java.io.*;
import java.util.*;

public class Main {
    static int n;
    static int[] arr;
    static List<Integer>[] record;

    static boolean dfs(int now, int team) {
        if (now == n) return true;
        for (int i = 0; i < team; i++) {
            List<Integer> list = record[i];
            boolean flag = true;
            for (int j : list) {
                if (arr[now] % j == 0) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                list.add(arr[now]);
                if (dfs(now + 1, team)) {
                    return true;
                }
                list.remove(list.size() - 1);
            }
        }
        return false;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner();
        n = sc.nextInt();
        record = new ArrayList[n];
        for (int i = 0; i < n; i++) {
            record[i] = new ArrayList<>();
        }
        arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        Arrays.sort(arr);
        for (int i = 1; i <= n; ++i) {
            if (dfs(0, i)) {
                System.out.println(i);
                break;
            }
        }
    }
}
class Scanner {
    static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    public int nextInt() {
        try {
            st.nextToken();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return (int) st.nval;
    }
}

C/C++

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N = 15;
int n, arr[N];
vector<int> record[N];

int dfs(int x, int team)
{
    if(x == n + 1)
        return true;
    
    for(int i = 1; i <= team; ++i)
    {
        int flag = 1;
        for(const auto j : record[i])
        {
            if(arr[x] % j == 0)
            {
                flag = 0;
                break;
            } 
        }
        if(flag)
        {
            record[i].push_back(arr[x]);
            if(dfs(x + 1, team))
                return true;
            record[i].pop_back();
        }
    }
    return false;
}

int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n;
    for(int i = 1; i <= n; ++i) cin >> arr[i];
    sort(arr + 1, arr + 1 + n);
    for(int i = 1; i <= n; ++i)
    {
        if(dfs(1, i)) 
        {
            cout << i;
            return 0;
        }
    }
}
相关推荐
4277240020 分钟前
IDEA使用git不提示账号密码登录,而是输入token问题解决
java·git·intellij-idea
chengooooooo41 分钟前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
李长渊哦44 分钟前
常用的 JVM 参数:配置与优化指南
java·jvm
计算机小白一个44 分钟前
蓝桥杯 Java B 组之设计 LRU 缓存
java·算法·蓝桥杯
万事可爱^1 小时前
HDBSCAN:密度自适应的层次聚类算法解析与实践
算法·机器学习·数据挖掘·聚类·hdbscan
黑不溜秋的1 小时前
C++ 设计模式 - 策略模式
c++·设计模式·策略模式
欧了1113 小时前
洛谷P9240 [蓝桥杯 2023 省 B] 冶炼金属
职场和发展·蓝桥杯·洛谷·蓝桥杯大学b组c语言
大数据追光猿3 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Dream it possible!4 小时前
LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
c++·算法·leetcode
夏末秋也凉4 小时前
力扣-回溯-46 全排列
数据结构·算法·leetcode