藍橋杯 歷屆試題 分考場

2021-10-04 10:15:26 字數 1719 閱讀 4983

問題描述

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