赛题说明:
输入格式:
输入由多组数据组成,以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;
}
}
}
}