n個人參加某項特殊考試。
為了公平,要求任何兩個認識的人不能分在同乙個考場。
求是少需要分幾個考場才能滿足條件。
第一行,乙個整數n(1一行乙個整數,表示最少分幾個考場。
樣例輸入58
1 21 3
1 42 3
2 42 5
3 44 5
樣例輸出
4樣例輸入510
1 21 3
1 41 5
2 32 4
2 53 4
3 54 5
樣例輸出
5題意:
題解:首先構建圖, room[i]表示第 i 個房間裡的人編號, 搜尋房間id和房間數cnt, 注意兩點
貪心: 如果有人能放id房間就放, 因為能省就省
剪枝: 當前房間數大於最小答案直接返回
每次有開新房間和放之前的房間兩種放法, 注意回溯
經驗小結:
多考慮考慮對什麼進行搜
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
#define ms(x, n) memset(x,n,sizeof(x));
typedef
long
long ll;
const
int inf =
1<<30;
const ll maxn =
110;
int n, m, ans = inf;
bool g[maxn]
[maxn]
;vector<
int> room[maxn]
;bool
judge
(int id,
int r)
void
dfs(
int id,
int cnt)
//能否放之前的房間
for(
int i =
1; i <= cnt;
++i)
}//放新房間
room[cnt+1]
.push_back
(id)
;dfs
(id+
1, cnt+1)
; room[cnt+1]
.pop_back()
;}intmain()
dfs(1,
0); cout << ans << endl;
return0;
}
歷屆試題 分考場
問題描述 n個人參加某項特殊考試。為了公平,要求任何兩個認識的人不能分在同乙個考場。求是少需要分幾個考場才能滿足條件。輸入格式 第一行,乙個整數n 1一開始以為是簡單的貪心問題,可不想一直正確率40 最後發現還是需要採用回溯,在剪枝下深度遍歷所有情況.include int pre 100 100 ...
歷屆試題 分考場
問題描述 n個人參加某項特殊考試。為了公平,要求任何兩個認識的人不能分在同乙個考場。求是少需要分幾個考場才能滿足條件。輸入格式 第一行,乙個整數n 1輸出格式 一行乙個整數,表示最少分幾個考場。樣例輸入58 1 21 3 1 42 3 2 42 5 3 44 5 樣例輸出 樣例輸入510 1 21 ...
歷屆試題 分考場
問題描述 n個人參加某項特殊考試。為了公平,要求任何兩個認識的人不能分在同乙個考場。求是少需要分幾個考場才能滿足條件。輸入格式 第一行,乙個整數n 1 第二行,乙個整數m,表示接下來有m行資料 以下m行每行的格式為 兩個整數a,b,用空格分開 1 a,b n 表示第a個人與第b個人認識。輸出格式 一...