zoukankan      html  css  js  c++  java
  • [蓝桥杯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函数就行,直接给出代码吧。

    #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;
    }
    


  • 相关阅读:
    0929作业
    0909上机作业
    熟悉的LINUX操作
    博客搭建成功啦!
    感谢管理员,通过了我的博客邀请。哈哈
    Asp.net常用的51个代码(非常实用)
    CSS命名规范:
    常用的JavaScript验证正则表达式
    Linq to sql 查询句法
    Web.config配置文件详解
  • 原文地址:https://www.cnblogs.com/lifehappy/p/12601202.html
Copyright © 2011-2022 走看看