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

news/2024/7/20 21:11:51 标签: 深度优先, 算法, 蓝桥杯, c++, java

题目链接

数字王国之军训排队

个人思路

一般最坏情况,就是这几个数都存在倍数关系,那么就是 n 个数分成 n 个队。然后本题 n 的范围不大,可以枚举 1 ~ n 得到,如果数字范围大可以考虑进行二分。从 1 ~ n ,第一次满足条件的队伍数,即答案,输出即可。
对于每一种队伍情况,使用dfs遍历每个数可以存放的队列,如果当前队列存在能被整除的数,则换下一个队;如果能放入当前队,则继续看下一个数。
先放入大的数,再放入小的数,肯定较小的数除以较大的数无法整除,所以需要先对数组排序。

	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++

#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;
        }
    }
}

http://www.niftyadmin.cn/n/5354093.html

相关文章

Linux shell编程学习笔记42:hdparm命令

ChatGPT 和文心一言哪个更好用&#xff1f; 从智能回复、语言准确性、知识库丰富度等方面比较&#xff0c;两大AI助手哪个更胜一筹&#xff1f;快来和我们分享一下你的看法吧~ 0 前言 获取硬盘序列号是信息资产管理和信息安全检测中经常要收集的信息&#xff0c;对于Linux来说…

如何写出让用户身临其境的画面感文案?

许多小伙伴在写文案时经常会碰到这样的困境&#xff0c;就是自己写得文案用了大量辞藻但是没有效果。因为在信息爆炸的时代下&#xff0c;用户天生不喜欢抽象的东西&#xff0c;只有具象化的东西才能让人不费脑子&#xff0c;所以我们要尽可能的将文案视觉化&#xff0c;去写有…

ChatGPT4 比 ChatGPT3.5 强在了那里?

刚开始的时候我还在纠结&#xff0c;一个月20 刀的ChatGPT4 &#xff0c;到底值不值这个价钱&#xff1f;使用过后发现&#xff0c;诶嘛真香。因为 GPT4 比 GPT3.5 多了太多功能&#xff0c;特别是识图能力&#xff0c;用好的话效率翻倍。 1. 看图写代码 ChatGPT4 相比 ChatG…

看过来:大龄程序员转行的18个方向

程序员35岁后&#xff0c;无人问津、被下岗&#xff0c;说到底还是中国互联网企业普遍短命和中国程序员新人不断涌现导致的&#xff0c;前者是岗位的缩减&#xff0c;后者是供应的增加&#xff0c;两者一叠加&#xff0c;35岁程序员就成了背锅侠。 大龄程序员和老医生一样都是非…

报错“MySql配置文件已损坏,请联系技术支持”的解决方法

目录 第一步 打开控制面板&#xff0c;选择管理工具&#xff0c;再选择事件查看器 第二步 在【应用程序】里找到这条报错&#xff0c;记下来文件内容。我自己的来源是“MsiInstaller” 第三步 winR组合键&#xff0c;输入regedit打开注册表 第四步 根据前面报错的文件名定位…

2024 年, Web 前端开发趋势

希腊哲学家赫拉克利特认为&#xff0c;变化是生命中唯一不变的东西。这句话适用于我们的个人生活、行业和职业领域。 尤其是前端开发领域&#xff0c;新技术、开发趋势、库和框架不断涌现&#xff0c;变化并不陌生。最近发生的一些事件正在改变开发人员构建网站和 Web 应用的方…

RT-Thread: 串口操作、增加串口、串口函数

说明&#xff1a;本文记录RT-Thread添加串口的步骤和串口的使用。 1.新增串口 官方链接&#xff1a;https://www.rt-thread.org/document/site/rtthread-studio/drivers/uart/v4.0.2/rtthread-studio-uart-v4.0.2/ 新增串口只需要在 board.h 文件中定义相关串口的宏定…

Flink中StateBackend(工作状态)与Checkpoint(状态快照)的关系

State Backends 由 Flink 管理的 keyed state 是一种分片的键/值存储&#xff0c;每个 keyed state 的工作副本都保存在负责该键的 taskmanager 本地中。另外&#xff0c;Operator state 也保存在机器节点本地。Flink 定期获取所有状态的快照&#xff0c;并将这些快照复制到持…