uva 12108特别困学生by小黑java

在这里插入图片描述
赛题说明:

输入格式:
输入由多组数据组成,以N=0N=0 结束。 第一行输入一个整数N(1≤N≤10)N(1≤N≤10) ,表示学生人数数。接下来NN 行,每行3个整数A,B,C(1 ≤ A, B ≤ 5)A,B,C(1≤A,B≤5) ,来描述一个学生每次清醒Ai 分钟,睡Bi 分钟,初始状态是第Ci 分钟。

输出格式:
对于每组数据,打印数据编号,并输出过了多少分钟后,所以学生都是清醒状态的,如果不存在这个时间,就输出-1

小黑题解:

程序模拟整个过程:
1.使用for循环初始化学生数组对象students和初始状态数组firstGroup。
2.通过while循环模拟当前时间的流逝。
3.使用sleep变量动态记录睡觉人的个数。
4.通过students与firstGroup的对比(对比每个学生的状态是否与初始时相同),判断是否进入了死循环(全班无法清醒)

注意:
1.通过覆盖equals方法比较students的每个对象的状态c是否对应相等。
2.while循环中time值先加1,然后再执行当前time的操作(当然你也可以在while语句块中最后累加time)
3.time的初始值为1,因为初始状态是第1秒内。
在这里插入图片描述
小黑运行:
在这里插入图片描述在这里插入图片描述
小黑代码及程序详解:

package 习题4_8特别困学生;
public class Student {
	private int a ;
	private int b;
	private int c ;
	public Student(int a, int b, int c) {
		this.a = a;
		this.b = b;
		this.c = c;
	}
	public int getA() {
		return a;
	}
	public void setA(int a) {
		this.a = a;
	}
	public int getB() {
		return b;
	}
	public void setB(int b) {
		this.b = b;
	}
	public int getC() {
		return c;
	}
	public void setC(int c) {
		this.c = c;
	}
	@Override
	public boolean equals(Object obj) {  //覆盖equals方法
		// TODO Auto-generated method stub
		if(this.c == ((Student)obj).c){
			return true;
		}
		return false;
	}
	
}
package 习题4_8特别困学生;

import java.util.Scanner;
/*
 * 
3
2 4 1
1 5 2
1 4 3
3
1 2 1
1 2 2
1 2 3
0
 */
public class Main {
	static int n;	//学生个数
	static Student[] students;	//学生状态数组	
	static Student[] firstGroup;	//获取首次的学生状态,检测是否会出现状态死循环
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请分别输入学生个数与每个学生的三元组:");
		n = sc.nextInt();  //学生个数
		students = new Student[n];
		firstGroup = new Student[n];
		int time = 1;	//初始化时间参数
		int sleep = 0;	//初始化睡觉的人数
		for (int i = 0; i < n; i++) {
			int a0 = sc.nextInt();   //清醒时间
			int b0 = sc.nextInt();	//沉睡时间
			int c0 = sc.nextInt();	//所处周期位置
			students[i] = new Student(a0,b0,c0);	//初始化学生数组对象
			firstGroup[i] = new Student(a0,b0,c0);
			if(c0 > a0){  
				sleep++;	//通过累加不断计算当前时间点的睡觉人数
			}
		}
		while(true){	//循环开始
			//System.out.println(time+"秒后:");
			time++;		//当前的时间的累加
			boolean isSleep = true;  //班里人是否能睡
			if(sleep <= n-sleep){	//如果睡觉人数小于等于清醒人数,则再等待Ai分钟
				isSleep = false;
			}
			for (int i = 0; i < n; i++) {	//依次遍历每个人
				if(students[i].getC()==students[i].getA()){		//这个人临睡前查看班级其他同学
					if(isSleep){	//如果满足条件则睡觉
						//System.out.print("第"+(i+1)+"名同学开始睡觉");
						sleep++;
					}else{
						students[i].setC(0);	//状态指针回到0,相当于还要等Ai分钟才睡
					}
				}else if(students[i].getC()==students[i].getA()+students[i].getB()){	//判断这一秒是否在wakeup边缘
					//System.out.print("第"+(i+1)+"名同学睡醒");
					sleep--;	//此同学睡醒
				}
				students[i].setC(students[i].getC()%(students[i].getA()+students[i].getB())+1);  //状态指针后移
			}
			if(sleep==0){	//全版苏醒
				System.out.println("经过了"+time+"分钟后,全班苏醒了!!");
				break;
			}
			//System.out.println();
			//判断是否出现死循环,即全班都不清醒的状态
			boolean same = true;
			for (int i = 0; i < n; i++) {
				if(!students[i].equals(firstGroup[i])){
					same = false;
					break;
				}
			}
			if(same){
				System.out.println("不存在全班都清醒的状态!");
				break;
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值