DFS 藍橋杯試題 分考場

2021-10-02 18:26:48 字數 1707 閱讀 9941

oj位址

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

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

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

第一行,乙個整數n(1一行乙個整數,表示最少分幾個考場。

5

81 2

1 31 4

2 32 4

2 53 4

4 5

4
5

101 2

1 31 4

1 52 3

2 42 5

3 43 5

4 5

5
在做這個題之前,做了乙個並查集的題,剛開始讀這個題的時候,以為還是乙個並查集的,很像。後來仔細想了想不是那回事。還是用dfs做吧。思路如下:

檢查第x個學生,看看能不能放入已分配的教室(檢查x與前邊分配好的學生的關係)

迴圈判斷前n個教室

​ 如果 能安排進當前教室,就分配進去

​ dfs下乙個學生

​ 回溯

此外,判斷完前n個教室,還可以考慮再新開乙個教室(這並不一定會使總的教室數增加,相反,可能會使總教室數減少)。

綜上,需要考慮的問題有兩個

記錄每個教室內已經安排的哪些學生。

判斷第x個學生能否安排在第y個教室

這裡,儲存教室與教室內學生,我使用的是map。我認為這樣比較好理解,first就是教室的編號,後邊的vector就是存放的每個已安排的學生。 獲取教室數量也很方便。如果使用二維陣列的話,還得有其他的變數來判斷教室的數量,稍嫌麻煩。

#include

using

namespace std;

int n,m;

bool link[

105]

[105];

// 兩個學生認不認識

map<

int,vector<

int>

> room;

int ans =

9999999

;bool

judge

(int x,

int num)

}return

true;}

void

dfs(

int x)

if( x >= n+1)

return;}

for(

int i =

0; i < room.

size()

; i++)}

// 再開乙個教室

int ii = room.

size()

; room[ii]

.push_back

(x);

dfs(x+1)

; room[ii]

.pop_back()

;// 拿出教室

// **這個教室 這裡容易忘記這個操作,要在map中刪除這條記錄。

room.

erase

(ii)

;return;}

intmain()

dfs(1)

; cout << ans << endl;

return0;

}

藍橋杯 歷屆試題 分考場 DFS

時間限制 1.0s 記憶體限制 256.0mb n個人參加某項特殊考試。為了公平,要求任何兩個認識的人不能分在同乙個考場。求是少需要分幾個考場才能滿足條件。第一行,乙個整數n 1一行乙個整數,表示最少分幾個考場。5 81 2 1 31 4 2 32 4 2 53 4 4 55 101 2 1 31 ...

藍橋杯 分考場(dfs)

dfs求解 思路每次判斷輸入的人是否可以和前面的組隊 問題描述 n個人參加某項特殊考試。為了公平,要求任何兩個認識的人不能分在同乙個考場。求是少需要分幾個考場才能滿足條件。輸入格式 第一行,乙個整數n 1 ans return if p n 1 for int i 1 i kans i 判斷完前面已...

藍橋杯 試題 歷屆試題 分考場 dfs 回溯

問題描述 n個人參加某項特殊考試。為了公平,要求任何兩個認識的人不能分在同乙個考場。求是少需要分幾個考場才能滿足條件。輸入格式 第一行,乙個整數n 1輸出格式 一行乙個整數,表示最少分幾個考場。樣例輸入58 1 21 3 1 42 3 2 42 5 3 44 5 樣例輸出 4樣例輸入510 1 21...