問題描述
n個人參加某項特殊考試。
為了公平,要求任何兩個認識的人不能分在同乙個考場。
求是少需要分幾個考場才能滿足條件。
輸入格式
第一行,乙個整數n(1思路:我的一開始的思路是貪心,保證目前是最優的,但是內心一直覺得很不合理所以就沒有去實現這個**。後來我終於明白不對在哪了,貪心只能保證區域性最優,全域性並不一定是最優的。
這道題目是乙個深度搜尋dfs的題目.
先貼上我的**:我的**只能過兩個測試點,希望那個大佬看到了幫我指正一下
#include
#include
int gxb[
110]
[110];
//關係表
int exam[
110]
[110]=
;//房間
int num=
100;
int k;
int n, m;
int i;
void
dfs(
int x,
int kcs)
//kcs是考場數
if(x == n +1)
for( i =
1; i <= kcs; i++)if
(exam[i]
[k]==0)
//在某個考場安排位置}if
(i == kcs +1)
//確保了只有在真的沒地方去時再建立乙個考場
}int
main
(void
)dfs(1
,0);
printf
("%d"
, num)
;return0;
}
思路:剛開始我一直不明白,這串**裡**體現了dfs,或者說,憑什麼dfs是對的,因為我剛開始以為dfs使得每個元素放置的考場是固定的,這樣的話舒徐就一定了,何談dfs呢,如果這樣的話,那麼如果不按1-100的順序安排人員,那麼產生的結果是不是就不一樣了呢。後來,我仔細的思考了很久,才知道某些地方是不能return 的,這樣才能實現深度搜尋。
這是某個大佬的**,我感覺我跟他一樣。。。。。
#include
#include
#define n 301
#define min(a,b) a>b?b:a
int gxb[n]
[n];
//關係表
int p[n]
[n];
// 房間狀態
int num=n,n;
void
dfs(
int x,
int kcs)
//如果已經安排了n個人,進行判斷
int j,k;
for(j=
1;j<=kcs;j++
)
p[j][0
]=x;
dfs(x+
1,kcs+1)
;// 如果所有房間都不滿足條件 增加房間
p[j][0
]=0;
//回溯 //回溯
}int
main()
dfs(1,
1);printf
("%d\n"
,num)
;return0;
}
藍橋杯 歷屆試題 分考場
問題描述 n個人參加某項特殊考試。為了公平,要求任何兩個認識的人不能分在同乙個考場。求是少需要分幾個考場才能滿足條件。輸入格式 第一行,乙個整數n 1輸出格式 一行乙個整數,表示最少分幾個考場。樣例輸入5 8 1 2 1 3 1 4 2 3 2 4 2 5 3 4 4 5樣例輸出 4樣例輸入5 10...
藍橋杯 歷屆試題 分考場
問題描述 n個人參加某項特殊考試。為了公平,要求任何兩個認識的人不能分在同乙個考場。求是少需要分幾個考場才能滿足條件。輸入格式 第一行,乙個整數n 1輸出格式 一行乙個整數,表示最少分幾個考場。樣例輸入58 1 21 3 1 42 3 2 42 5 3 44 5 樣例輸出 樣例輸入510 1 21 ...
藍橋杯 歷屆試題 分考場 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 ...