Submission #2119032


Source Code Expand

#[allow(unused_imports)]
use std::io::*;
#[allow(unused_imports)]
use std::str::*;
#[allow(unused_imports)]
use std::mem::*;
#[allow(unused_imports)]
use std::cmp::*;
#[allow(unused_imports)]
use std::collections::HashSet;
#[allow(unused_imports)]
use std::collections::VecDeque;
#[allow(unused_imports)]
use std::usize;

#[allow(dead_code)]
fn read<T: FromStr>() -> T {
    let mut line = String::new();
    stdin().read_line(&mut line).unwrap();
    line.trim().to_string().parse().ok().unwrap()
}

#[allow(dead_code)]
fn read_cols<T: FromStr>() -> Vec<T> {
    let mut line = String::new();
    stdin().read_line(&mut line).unwrap();

    line.trim()
        .split_whitespace()
        .map(|s| s.parse().ok().unwrap())
        .collect()
}

#[derive(PartialEq, Eq, Hash, Clone, Copy)]
struct CacheKey {
    len: usize,
    last_num_man: u32,
}

fn find_min_num(
    num_man_in_groups: &[u32],
    last_num_man: u32,
    cache: &mut HashSet<CacheKey>,
) -> Option<u32> {
    let len = num_man_in_groups.len();
    let key = CacheKey { len, last_num_man };

    if cache.contains(&key) {
        return None;
    }

    if len == 0 {
        return Some(last_num_man);
    }

    let last = *num_man_in_groups.last().unwrap();
    if last_num_man % last > 0 {
        cache.insert(key);
        return None;
    }

    for last_drop in 0..last {
        let ret = find_min_num(
            num_man_in_groups.get(0..len - 1).unwrap(),
            last_num_man + last_drop,
            cache,
        );
        if let Some(_) = ret {
            return ret;
        }
    }

    cache.insert(key);
    None
}

fn find_max_num(
    num_man_in_groups: &[u32],
    last_num_man: u32,
    cache: &mut HashSet<CacheKey>,
) -> Option<u32> {
    let len = num_man_in_groups.len();

    let key = CacheKey { len, last_num_man };

    if cache.contains(&key) {
        return None;
    }

    if len == 0 {
        return Some(last_num_man);
    }

    let last = *num_man_in_groups.last().unwrap();
    if last_num_man % last > 0 {
        cache.insert(key);
        return None;
    }

    for last_drop in (0..last).rev() {
        let ret = find_max_num(
            num_man_in_groups.get(0..len - 1).unwrap(),
            last_num_man + last_drop,
            cache,
        );
        if let Some(_) = ret {
            return ret;
        }
    }

    cache.insert(key);
    None
}

fn main() {
    // 00:04:00
    let num_rounds = read::<u32>();
    let num_man_in_groups = read_cols::<u32>();
    let last_num_man = 2;

    assert_eq!(num_rounds as usize, num_man_in_groups.len());

    let mut cache = HashSet::new();
    let min = find_min_num(num_man_in_groups.as_slice(), last_num_man, &mut cache);
    if min.is_none() {
        println!("-1");
        return;
    }

    let max = find_max_num(num_man_in_groups.as_slice(), last_num_man, &mut cache);
    println!("{} {}", min.unwrap(), max.unwrap());
    // 0:29:22
    // 25min 22sec
}

Submission Info

Submission Time
Task B - Ice Rink Game
User hiratai
Language Rust (1.15.1)
Score 0
Code Size 3080 Byte
Status CE

Compile Error

error: struct field shorthands are unstable (see issue #37340)
  --> ./Main.rs:46:26
   |
46 |     let key = CacheKey { len, last_num_man };
   |                          ^^^

error: struct field shorthands are unstable (see issue #37340)
  --> ./Main.rs:46:31
   |
46 |     let key = CacheKey { len, last_num_man };
   |                               ^^^^^^^^^^^^

error: struct field shorthands are unstable (see issue #37340)
  --> ./Main.rs:84:26
   |
84 |     let key = CacheKey { len, last_num_man };
   |                          ^^^

error: struct field shorthands are unstable (see issue #37340)
  --> ./Main.rs:84:31
   |
84 |     let key = CacheKey { len, last_num_man };
   |                               ^^^^^^^^^^^^

error: aborting due to 4 previous errors