題解 歷屆試題 分考場 搜尋 剪枝

2021-09-23 10:29:22 字數 1438 閱讀 7217

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個人認識。輸出格式 一...