藍橋每日打卡--分考場

#藍橋#JAVA#分考場

題目描述

n個人參加某項特殊考試。

為了公平,要求任何兩個認識的人不能分在同一個考場。

求是少需要分幾個考場才能滿足條件。

輸入描述

輸入格式:

第一行,一個整數n(1≤n≤100),表示參加考試的人數。

第二行,一個整數m,表示接下來有m行數據。

以下m行每行的格式為:兩個整數a,b,用空格分開 (1≤a,b≤n)表示第a個人與第b個人認識。

輸出描述

輸出一行一個整數,表示最少分幾個考場。

問題分析

本題的核心問題是在給定一定數量的學生以及學生之間的認識關系的情況下,找出使用最少考場來安排所有學生的方案,并且要保證每個考場內的學生彼此都不認識。由于需要探索所有可能的考場安排組合,從中找出最優解,所以可以采用深度優先搜索(DFS)算法來解決。

1. 窮舉所有可能的方案

在這個問題中,每個學生都有多種選擇,可以被安排到已有的某個考場,或者新開一個考場。因為學生數量和考場安排的可能性眾多,要找出使用最少考場的方案,就需要遍歷所有可能的安排方式。DFS 算法的特點是能夠按照一定的順序,遞歸地深入搜索每一種可能的路徑,從而實現對所有可能方案的窮舉。 例如,對于第一個學生,它可以被安排到第一個考場;對于第二個學生,它可以選擇和第一個學生在同一個考場(前提是他們不認識),也可以新開一個考場。通過 DFS,我們可以依次嘗試所有這些可能性,確保不會遺漏任何一種安排方案。

2. 回溯機制

便于嘗試不同選擇 DFS 算法具有回溯機制,這在本題中非常有用。當我們將一個學生安排到某個考場后,繼續遞歸安排后續學生。如果后續發現這種安排方式無法滿足所有學生的安排或者不是最優方案,我們可以通過回溯操作撤銷之前的安排,嘗試其他的安排方式。 在代碼中,當我們將學生 `x` 安排到 `nums[i][j]` 座位后,遞歸調用 `dfs` 方法安排下一個學生。如果后續的遞歸過程中發現這種安排不行,返回后會將 `nums[i][j]` 置為 0,即撤銷該安排,然后嘗試將學生 `x` 安排到其他考場或座位。

3. 剪枝優化提高效率

在搜索過程中,我們可以利用剪枝策略來減少不必要的搜索。在本題中,如果當前使用的考場數量已經大于等于之前記錄的最少考場數量,那么繼續搜索下去不可能得到更優的方案,此時可以直接返回,避免繼續深入搜索,從而提高算法的效率。 例如,在 `dfs` 方法中,當 `k >= sum` 時,就直接返回,不再進行后續的搜索。

4. 遞歸實現

簡單直觀 DFS 算法通常使用遞歸的方式實現,代碼結構清晰,邏輯簡單直觀。在本題中,通過遞歸調用 `dfs` 方法,不斷地安排下一個學生,同時更新考場數量,使得代碼的實現和問題的解決思路高度一致,易于理解和維護。 綜上所述,由于本題需要窮舉所有可能的考場安排方案,并且需要回溯機制來嘗試不同的選擇,同時可以利用剪枝優化提高效率,因此使用 DFS 算法是一個合適的選擇。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {static int sum = 110;// 最多可以安排的教室static int nums[][] = new int [100][100]; //nums[i][k] 考場表 i 表示考場,k表示座位 static boolean visi[][] = new boolean [100][100];// 記錄考場信息static int n; // 學生數量static int m; // 關系數據的數量static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));public static void main(String[] args) throws IOException{String [] sc = bf.readLine().split(" ");n = Integer.parseInt(sc[0]);sc = bf.readLine().split(" ");m = Integer.parseInt(sc[0]);for (int i = 0; i < m ; i++){sc = bf.readLine().split(" ");int x = Integer.parseInt(sc[0]);int y = Integer.parseInt(sc[1]);// 標記互相認識的人visi[x][y] = true;visi[y][x] = true;}dfs(1, 1);System.out.println(sum);}// x 代表第幾個學生, k考場public static void dfs(int x,int k){// 剪枝 如果當前考場大于最小考場,就沒必要繼續則返回if(k >= sum) return;// 第x學生>全部學生,表明全部的學生都進入了考場,所有學生都有考場if(x > n){sum = Math.min(k, sum);//只需從當前考場值和當前最小值中取最小值return;}//為每一位學生分配考場for (int i = 1; i <= k; i++){int j = 0;//考場有人且無認識的人//i代表考場  j 代表座位號                while(nums[i][j] != 0 && !visi[x][nums[i][j]]){j++;}//考場為空if(nums[i][j] == 0){// x 進入nums[i][j]考場nums[i][j] = x;//下一位同學進行分配dfs(x + 1, k);//回溯  以便找到更好的方法nums[i][j] = 0;}}// 開辟完所有的考場發現都認識那就只可以再開一所考場了nums[k + 1][0] = x;dfs(x + 1, k + 1);//回溯nums[k + 1][0] = 0;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72583.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72583.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72583.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RMAN備份bug-審計日志暴漲(select action from gv$session)

問題概述 /oracle 文件系統使用率過大&#xff0c;經過檢查是審計日志過大,/oracle 目錄 197G 審計日志占用70G&#xff0c;每6個小時產生大量審計日志&#xff0c;日志內容全是select action from gv$session &#xff0c;猜測可能跟備份有關&#xff0c; $>df -h /oracle…

在Blender中給SP分紋理組

在Blender中怎么分SP的紋理組/紋理集 其實紋理組就是材質 把同一組的材質分給同一組的模型 導入到sp里面自然就是同一個紋理組 把模型導入SP之后 就自動分好了

Nuxt:Nuxt3框架中onBeforeMount函數 和onBeforeRouteUpdate函數區別介紹 【超詳細!】

提示&#xff1a;在 Nuxt3 中&#xff0c;onBeforeMount 和 onBeforeRouteUpdate 是兩個不同場景下使用的鉤子函數&#xff0c;分別對應 Vue 組件生命周期 和 路由導航守衛。以下是它們的詳細解釋和對比&#xff1a; 文章目錄 一、onBeforeMount&#xff08;Vue 生命周期鉤子&a…

華為 Open Gauss 數據庫在 Spring Boot 中使用 Flyway

db-migration&#xff1a;Flyway、Liquibase 擴展支持達夢&#xff08;DM&#xff09;、南大通用&#xff08;GBase 8s&#xff09;、OpenGauss 等國產數據庫。部分數據庫直接支持 Flowable 工作流。 開源代碼倉庫 Github&#xff1a;https://github.com/mengweijin/db-migrat…

java 查找兩個集合的交集部分數據

利用了Java 8的Stream API&#xff0c;代碼簡潔且效率高 import java.util.stream.Collectors; import java.util.List; import java.util.HashSet; import java.util.Set;public class ListIntersection {public static List<Long> findIntersection(List<Long> …

雙足機器狗開發:Rider - Pi

雙足機器狗開發:Rider - Pi https://github.com/YahboomTechnology/Rider-Pi-Robot 項目介紹 Rider - Pi是一款為開發者、教育工作者和機器人愛好者設計的桌面雙輪腿式機器人,它基于樹莓派CM4核心模塊構建,具備多種先進功能和特點: 硬件特性 核心模塊:采用樹莓派CM4核…

Android12 添加開機鈴聲

系統默認是沒有播放開機鈴聲的功能&#xff0c;MTK有一套自己的開機鈴聲處理邏輯&#xff0c;代碼在/vendor/mediatek/proprietary/operator/frameworks/bootanimation/MtkBootanimation下&#xff0c;但是在10之后MTK就不在維護這部分代碼了。直接使用會有很多編譯報錯&#x…

3.6V-30V寬壓輸入降壓同步IC內置MOS,電流4A/5A/6A,可以滿足汽車應急電源,BMS電池,電池組USB口輸出等儲能應用

今天給大家介紹一下這三款產品&#xff0c;分別是CJ92340,輸入電壓4.5V-30V&#xff0c;輸出可調&#xff0c;電流負載能力可達4A&#xff0c;頻率350KHZ。CJ92350,輸入電壓3.6V-30V&#xff0c;輸出可調&#xff0c;頻率可調&#xff0c;帶載能力達5A。CJ92360,輸入電壓3.6V-3…

代碼隨想錄算法訓練營第35天 | 01背包問題二維、01背包問題一維、416. 分割等和子集

一、01背包問題二維 二維數組&#xff0c;一維為物品&#xff0c;二維為背包重量 import java.util.Scanner;public class Main{public static void main(String[] args){Scanner scanner new Scanner(System.in);int n scanner.nextInt();int bag scanner.nextInt();int[…

010---基于Verilog HDL的分頻器設計

文章目錄 摘要一、時序圖二、程序設計2.1 rtl2.2 tb 三、仿真分析四、實用性 摘要 文章為學習記錄。繪制時序圖&#xff0c;編碼。通過修改分頻值參數&#xff0c;實現一定范圍分頻值內的任意分頻器設計。 一、時序圖 二、程序設計 2.1 rtl module divider #(parameter D…

維度建模事實表技術基礎解析(以電商場景為例)

維度建模事實表技術基礎解析(以電商場景為例) 1. 事實表結構 定義:事實表是維度建模的核心,由外鍵(關聯維度表)、度量值(可量化的業務指標)及退化維度(冗余的維度屬性)組成。其本質是記錄業務過程中的度量事件,例如電商訂單金額、商品庫存量等。 場景識別:適用于…

Redis 主從復制、哨兵與集群的關系及工作原理詳解

一、核心概念與關系 Redis 的 主從復制、哨兵&#xff08;Sentinel&#xff09; 和 集群&#xff08;Cluster&#xff09; 是逐步演進的高可用與分布式解決方案&#xff0c;三者關系如下&#xff1a; 主從復制&#xff1a;數據冗余與讀寫分離的基礎。 哨兵&#xff1a;在主從…

確認機制的分類及其區別與聯系探討

在傳輸控制中&#xff0c;確認機制&#xff08;ACK 機制&#xff09;作為反饋模塊在實現擁塞控制、丟包恢復和狀態監測等功能中起到了至關重要的作用。今天我將基于之前發表的論文研究成果&#xff0c;對確認機制的分類進行系統梳理&#xff0c;并討論各類機制之間的區別與聯系…

115 道 MySQL 面試題,從簡單到深入!

1. 什么是數據庫事務&#xff1f; 數據庫事務是一個作為單個邏輯工作單元執行的一系列操作。事務具有ACID屬性&#xff0c;即原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔離性&#xff08;Isolation&#xff09;和持久性&#xf…

Linux - 網絡套接字

一、網絡編程 1&#xff09;地址結構 1. IP地址結構 struct in_addr&#xff1a;是用于表示 IPv4 地址 的結構體&#xff0c;定義在頭文件 <netinet/in.h> 中。它的主要作用是存儲一個 32 位的 IPv4 地址&#xff0c;通常與 struct sockaddr_in 一起使用。 struct in_a…

程序員學商務英語之Visiting the Factory

Dialogue-1 Arranging a Visit安排參觀 I was wondering if you would / could lend me a million bucks, you know, I’m trying to start / run my own business. 我想知道你是否能夠借給我一百萬美金&#xff0c;你知道&#xff0c;我正在創業。 Take off your tie befor…

機器視覺運動控制一體機在天地蓋同步跟隨貼合解決方案

市場應用背景 紙盒天地蓋是一種包裝形式&#xff0c;廣泛應用于消費電子、食品禮盒、奢侈品及化妝品等領域。其采用高強度紙板&#xff0c;經過預組裝處理&#xff0c;結構堅固穩定&#xff0c;能有效保護產品并提升品牌形象。隨著包裝行業快速發展&#xff0c;市場對天地蓋的…

【智能體Agent】ReAct智能體的實現思路和關鍵技術

基于ReAct&#xff08;Reasoning Acting&#xff09;框架的自主智能體 import re from typing import List, Tuplefrom langchain_community.chat_message_histories.in_memory import ChatMessageHistory from langchain_core.language_models.chat_models import BaseChatM…

Electron打包工具對比

在 Electron 生態中&#xff0c;打包工具的選擇直接影響開發效率、配置復雜度和最終應用的性能。以下是主流的 Electron 打包工具及其優劣分析&#xff0c;結合你的 Vue 項目需求&#xff0c;我會在最后給出推薦方案&#xff1a; 一、主流 Electron 打包工具對比 1. Electron …

云原生系列之本地k8s環境搭建

前置條件 Windows 11 家庭中文版&#xff0c;版本號 23H2 云原生環境搭建 操作系統啟用wsl(windows subsystem for linux) 開啟wsl功能&#xff0c;如下圖 安裝并開啟github加速器 FastGithub 2.1 下載地址&#xff1a;點擊下載 2.2 解壓安裝文件fastgithub_win-x64.zip 2…