日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[蓝桥杯2017决赛]分考场、OpenJudge:分成互质数

發(fā)布時(shí)間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [蓝桥杯2017决赛]分考场、OpenJudge:分成互质数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

分考場(chǎng)傳送門
分成互質(zhì)數(shù)傳送門
題目描述
n個(gè)人參加某項(xiàng)特殊考試。
為了公平,要求任何兩個(gè)認(rèn)識(shí)的人不能分在同一個(gè)考場(chǎng)。
求最少需要分幾個(gè)考場(chǎng)才能滿足條件。
輸入
第一行,一個(gè)整數(shù)n(1<n<100),表示參加考試的人數(shù)。
第二行,一個(gè)整數(shù)m,表示接下來(lái)有m行數(shù)據(jù)
以下m行每行的格式為:兩個(gè)整數(shù)a,b,用空格分開(kāi) (1<=a,b<=n) 表示第a個(gè)人與第b個(gè)人認(rèn)識(shí)(編號(hào)從1開(kāi)始)。
輸出
一行一個(gè)整數(shù),表示最少分幾個(gè)考場(chǎng)。
樣例輸入
5
8
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5
樣例輸出
4

大意就是要讓互相認(rèn)識(shí)的人不要在同一個(gè)考場(chǎng),然后求最小考場(chǎng)數(shù),這里可以用涂色法來(lái)確認(rèn)兩人在不在同意考場(chǎng),具體代碼如下。

#include<iostream> #include<csttring> #include<algorithm> const int N=110; int a[N][N],rl[N],rp[N][N],n,ans=N;//a數(shù)組是涂色數(shù)組,rl,roomlenth.是房間的當(dāng)前人數(shù),rp,roompeople.是當(dāng)前房間的人。 using namespace std; bool judge(int pos,int room) {for(int i=1;i<=rl[room];i++)//當(dāng)前房子有沒(méi)有認(rèn)識(shí)的人,if(a[pos][rp[room][i]])//互相涂色的表示認(rèn)識(shí),返回false。return false;return true;//前面沒(méi)有找到互相認(rèn)識(shí)的人,然會(huì)true。 } void dfs(int pos,int total) {//pos是當(dāng)前尋找的人,total是當(dāng)前答案。if(total>=ans) return ;//當(dāng)前答案大于最優(yōu)解剪枝。if(pos==n+1) { ans=min(ans,total); return ; }//最優(yōu)答案。for(int i=1;i<=total;i++) {//遍歷之前已近放置的房子,看看有沒(méi)有符合要求的,if(judge(pos,i)) {/第pos個(gè)人在第i個(gè)房子是否合理,rp[i][++rl[i]]=pos;dfs(pos+1,total);rl[i]--;//回溯。}}rp[total+1][++rl[total+1]]=pos;//前面的房子全部不滿住。重新開(kāi)一個(gè)房子。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);從第一個(gè)人開(kāi)始搜索,cout<<ans<<endl;return 0; }

7834:分成互質(zhì)組
總時(shí)間限制: 1000ms 內(nèi)存限制: 65536kB
描述
給定n個(gè)正整數(shù),將它們分組,使得每組中任意兩個(gè)數(shù)互質(zhì)。至少要分成多少個(gè)組?

輸入
第一行是一個(gè)正整數(shù)n。1 <= n <= 10。
第二行是n個(gè)不大于10000的正整數(shù)。
輸出
一個(gè)正整數(shù),即最少需要的組數(shù)。
樣例輸入
6
14 20 33 117 143 175
樣例輸出
3
其實(shí)這兩道題目都是差不都的方法,上面的分考場(chǎng)是判斷認(rèn)識(shí)不認(rèn)識(shí),這里的是判斷他們兩個(gè)的最大公因數(shù)是不是 1 ,做法都大致相同,只要把上面的判斷數(shù)組改成gcd函數(shù)就行,直接給出代碼吧。

#include<iostream> #include<cstring> #include<algorithm> int n,a[20],rl[20],rp[20][20],ans; using namespace std; int gcd(int h,int j) {if(j==0) return h;return gcd(j,h%j); } bool judge(int c,int j) {for(int i=1;i<=rl[j];i++)if(gcd(c,rp[j][i])!=1) return false;return true; } void dfs(int pos,int total) {if(total>=ans) return ;if(pos==n) {ans=min(ans,total);return ;}for(int i=1;i<=total;i++) {if(judge(a[pos],i)) {rp[i][++rl[i]]=a[pos];dfs(pos+1,total);rl[i]--;}}rp[total+1][++rl[total+1]]=a[pos];dfs(pos+1,total+1);rl[total+1]--; } int main() {cin>>n;for(int i=0;i<n;i++)cin>>a[i];ans=1<<30;memset(rl,0,sizeof(rl));dfs(0,0);cout<<ans<<endl;return 0; }

總結(jié)

以上是生活随笔為你收集整理的[蓝桥杯2017决赛]分考场、OpenJudge:分成互质数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。