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