特别困的学生(Extraordinarily Tired Students, ACM/ICPC Xi‘an 2006, UVa12108)rust解法

课堂上有n个学生(n≤10)。每个学生都有一个“睡眠-清醒”周期,其中第i个学生醒Ai分钟后睡Bi分钟,然后重复(1≤Ai,Bi≤5),初始时第i个学生处在他的周期的第Ci分钟。每个学生在临睡前会察看全班睡觉人数是否严格大于清醒人数,只有这个条件满足时才睡觉,否则就坚持听课Ai分钟后再次检查这个条件。问经过多长时间后全班都清醒。如果用(A,B,C)描述一些学生,则图4-11中描述了3个学生(2,4,1)、(1,5,2)和(1,4,3)在每个时刻的行为。
特别困的学生(Extraordinarily Tired Students, ACM/ICPC Xi‘an 2006, UVa12108)rust解法_第1张图片有可能并不存在“全部都清醒”的时刻,此时应输出-1。

样例:
输入

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

输出

18
-1

分析:
后一分钟要以前一分钟的睡眼人数为依据。
当前状态和初始状态相同就表示不存在“全部都清醒”的时刻。

解法:

use std::io;
#[derive(Debug)]
struct Student {
    a: usize,
    b: usize,
    c: usize,
    d: usize,
}
fn main() {
    let mut buf = String::new();
    io::stdin().read_line(&mut buf).unwrap();
    let n: usize = buf.trim().parse().unwrap();
    let mut students: Vec<Student> = vec![];
    for _ in 0..n {
        let mut buf = String::new();
        io::stdin().read_line(&mut buf).unwrap();
        let v: Vec<usize> = buf.split_whitespace().map(|x| x.parse().unwrap()).collect();
        students.push(Student {
            a: v[0],
            b: v[1],
            c: v[2],
            d: v[2],
        });
    }
    //println!("{:?}", students);
    let mut time = 1;
    loop {
        let mut sleeping = 0;
        for s in students.iter() {
            if s.d > s.a {
                sleeping += 1;
            }
        }
        //println!("{:?} {} sleeping {}", students, time, sleeping);
        if sleeping == 0 {
            println!("{}", time);
            break;
        }
        for s in students.iter_mut() {
            if s.d == s.a && sleeping <= n - sleeping {
                s.d = 1;
            } else {
                s.d = s.d % (s.a + s.b) + 1;
            }
        }
        time += 1;
        //println!("{:?} {} sleeping {}", students, time, sleeping);
        let mut bsame = true;
        //检查当前状态是否和初始状态相同,相同就表示不存在“全部都清醒”的时刻
        for s in students.iter() {
            if s.d != s.c {
                bsame = false;
            }
        }
        if bsame {
            println!("-1");
            break;
        }
    }
}

你可能感兴趣的:(rust题解,rust,开发语言,后端)