[蓝桥杯2017决赛]分考场、OpenJudge:分成互质数
分考場傳送門
分成互質數傳送門
題目描述
n個人參加某項特殊考試。
為了公平,要求任何兩個認識的人不能分在同一個考場。
求最少需要分幾個考場才能滿足條件。
輸入
第一行,一個整數n(1<n<100),表示參加考試的人數。
第二行,一個整數m,表示接下來有m行數據
以下m行每行的格式為:兩個整數a,b,用空格分開 (1<=a,b<=n) 表示第a個人與第b個人認識(編號從1開始)。
輸出
一行一個整數,表示最少分幾個考場。
樣例輸入
5
8
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5
樣例輸出
4
大意就是要讓互相認識的人不要在同一個考場,然后求最小考場數,這里可以用涂色法來確認兩人在不在同意考場,具體代碼如下。
#include<iostream> #include<csttring> #include<algorithm> const int N=110; int a[N][N],rl[N],rp[N][N],n,ans=N;//a數組是涂色數組,rl,roomlenth.是房間的當前人數,rp,roompeople.是當前房間的人。 using namespace std; bool judge(int pos,int room) {for(int i=1;i<=rl[room];i++)//當前房子有沒有認識的人,if(a[pos][rp[room][i]])//互相涂色的表示認識,返回false。return false;return true;//前面沒有找到互相認識的人,然會true。 } void dfs(int pos,int total) {//pos是當前尋找的人,total是當前答案。if(total>=ans) return ;//當前答案大于最優解剪枝。if(pos==n+1) { ans=min(ans,total); return ; }//最優答案。for(int i=1;i<=total;i++) {//遍歷之前已近放置的房子,看看有沒有符合要求的,if(judge(pos,i)) {/第pos個人在第i個房子是否合理,rp[i][++rl[i]]=pos;dfs(pos+1,total);rl[i]--;//回溯。}}rp[total+1][++rl[total+1]]=pos;//前面的房子全部不滿住。重新開一個房子。dfs(pos+1,total+1);rl[total+1]--;回溯。 } int main() {int x,y,m;cin>>n>>m;for(int i=0;i<m;i++) {//讀入加涂色。cin>>x>>y;a[x][y]=1;a[y][x]=1;}dfs(1,0);從第一個人開始搜索,cout<<ans<<endl;return 0; }7834:分成互質組
總時間限制: 1000ms 內存限制: 65536kB
描述
給定n個正整數,將它們分組,使得每組中任意兩個數互質。至少要分成多少個組?
輸入
第一行是一個正整數n。1 <= n <= 10。
第二行是n個不大于10000的正整數。
輸出
一個正整數,即最少需要的組數。
樣例輸入
6
14 20 33 117 143 175
樣例輸出
3
其實這兩道題目都是差不都的方法,上面的分考場是判斷認識不認識,這里的是判斷他們兩個的最大公因數是不是 1 ,做法都大致相同,只要把上面的判斷數組改成gcd函數就行,直接給出代碼吧。
總結
以上是生活随笔為你收集整理的[蓝桥杯2017决赛]分考场、OpenJudge:分成互质数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 柏叶的功效与作用、禁忌和食用方法
- 下一篇: 对称迷宫