蓝桥杯备赛练习(一) 分考场(JAVA)

问题描述

  n个人参加某项特殊考试。
  为了公平,要求任何两个认识的人不能分在同一个考场。
  求是少需要分几个考场才能满足条件。

输入格式

  第一行,一个整数n(1<n<100),表示参加考试的人数。
  第二行,一个整数m,表示接下来有m行数据
  以下m行每行的格式为:两个整数a,b,用空格分开 (1<=a,b<=n) 表示第a个人与第b个人认识。

输出格式

  一行一个整数,表示最少分几个考场。

样例输入

5
8
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5

样例输出

4

样例输入

5
10
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5

样例输出

5

参考代码

import java.util.Scanner;

public class Main {
	public static int min=100;
	public static int n,m;
	public static int[][] whetherF;  //判断是否认识,认识则为1,否则为0
	public static int[][] examRoom;  //考场中的学生
	public static int[] stuNum;  //各考场学生人数
	public static void solve(int id,int num){    //id表示学生,num表示当前考场的编号  
	    if(num>=min)
	    {                
	        return;  //当现在安排的数量大于最小的教室数量则返回
	    }  
	    if(id>n)
	    {                  
	        min=Math.min(min,num);  //安排的学生已大于学生人数,意味着已经安排完所有的学生
	        return;  
	    }  
	    for(int i=1;i<=num;i++)  //首先看之前的房间是否能放进去 
	    {    
	        int stuInRm=stuNum[i];  
	        int UFnum=0;      
	        for(int j=1;j<=stuInRm;j++)
	        {  
	            if(whetherF[id][examRoom[i][j]]==0)
	            {  
	                UFnum++;  
	            }  
	        }  //得到与此人不认识的人数
	        if(UFnum==stuInRm)  //当前学生与该考场中的学生都不认识
	        {     
	        		examRoom[i][++stuNum[i]]=id; //将该学生存到这个考场中  
	            solve(id+1,num);  
	            stuNum[i]--;  
	        }  
	    }  
	    //新增一个考场 
	    examRoom[num+1][++stuNum[num+1]]=id;  //没有的话就把它放到下一个教室里  
	    solve(id+1,num+1);  
	    --stuNum[num+1];  
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scn = new Scanner(System.in);
		n = scn.nextInt();
		m = scn.nextInt();
		whetherF=new int[110][110];
		examRoom=new int[110][110];   //ExamRoom[1][1] = 2,examRoom[1][2] = 0;表示考场1里面第一个存在的人是2,然后后面一位是0,也就是不存在人了,那么这时该考场只有一个人  
		stuNum=new int[110];         //各考场学生人数
		while(m-->0)
		{  
			int a = scn.nextInt();
			int b = scn.nextInt();  
			whetherF[a][b]=whetherF[b][a]=1;  
		}  //对认识的人做标记
		solve(1,0);  
		System.out.println(min);	
		scn.close();
	}

}

本文参考:https://blog.csdn.net/txb_txb/article/details/80346964

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值