藍橋杯分考場

2021-09-05 08:49:10 字數 1090 閱讀 7115

因為資料量很小可以使用回溯演算法。

應用兩層回溯:

第一層回溯是將考生放在不同考場裡面產生的效果,比如學生3號可以放在教室1和教室2中那麼放在那乙個教室會產生更好的效果這是一層回溯。

第二層回溯是考生放入以前的考場還是考生自己重新用乙個考場。比如考生3號可以放進教室1和教室2,也可以放進教室3。

應用簡單的剪枝技巧:

現在考場的數量已經大於以前最少的考場數量了就不用在展開了。

因為題目中沒有時間限制,所以可以不使用vector,使用二維陣列存放邊,使用二維陣列存放教室中學生。

另外使用vecot中的find()總是報錯所以就不使用了

使用二維陣列的時間複雜度約為o(nn)因為沒乙個學生需要遍歷之前的考場就需要遍歷每個人一次1 + 2…+n - 1;

使用vector最好的情況是nlogn,這種情況對應只有乙個考場,每個學生耗費logn的複雜度,nlogn,最壞的情況就會退成o(nn),對應著n個考場,每個之前的學生都需要遍歷一次。

#include#include#include#includeusing namespace std;

const int maxn = 100 + 5;

int room[maxn][maxn];//儲存教室i中第j個學生的id

int gra[maxn][maxn];//存圖

int m,n;

int res = maxn + 500;//儲存答案

void solve(int id,int num)

if(id > n)

for(int i = 1;i <= num;i++)

k++;//不要寫在陣列裡面防止執行順序的不對而出錯

}if(flag)

}//重新開啟乙個教室

room[num+1][0] = id;

solve(id+1,num+1);

room[num+1][0] = 0;//第二層回溯

}void init()

int main()

solve(1,0);

printf("%d\n",res);

return 0;

}

藍橋杯 分考場

規模n 100,可以用回溯暴力解決,簡單剪枝把大於最優房間的狀態全部剪掉。大體思路,每給乙個人安置考場的時候,把當前安排出去的所有考場都試一遍,如果某考場沒有熟人,遞迴。直到把所有安排過的考場試一遍以後,再把他安排到乙個新的考場,遞迴,當p n時,直接記錄當前解是否少於當前最優解 貼 include...

藍橋杯 分考場

問題描述 n個人參加某項特殊考試。為了公平,要求任何兩個認識的人不能分在同乙個考場。求是少需要分幾個考場才能滿足條件。輸入格式 第一行,乙個整數n 1 include include includeusing namespace std const int maxn 105 const int in...

藍橋杯 分考場

問題描述 n個人參加某項特殊考試。為了公平,要求任何兩個認識的人不能分在同乙個考場。求是少需要分幾個考場才能滿足條件。輸入格式 第一行,乙個整數n 1 有問題,但是不知道錯在 思路感覺沒有問題 後面發現了再改 include include include using namespace std i...