Computer olympiad training

Common functions

#![allow(unused)]
fn main() {
#[allow(warnings)]
pub mod lib {
    pub fn hexadecimal_to_decimal(h: &str) -> i32 {
        let mut result = 0;
        for c in h.get(2..).unwrap().to_string().chars() {
            match c.to_digit(16) {
                Some(d) => result = result * 16 + d as i32,
                None => return -1,
            }
        }
        result
    }
    pub fn parse_to_int(b: &str) -> Option<i32> {
        if b.len() == 0 {
            return None;
        }
        let mut res = 0;
        for c in b.chars() {
            res *= 10;
            res += c as i32 - 48;
        }
        return Some(res);
    }
    pub fn binary_to_decimal(num: &str) -> Option<i64> {
        if num.len() == 0 {
            return None;
        }
        let mut sum = 0;
        let vec = num
            .chars()
            .map(|x| i64::from(x.to_digit(10).unwrap()))
            .collect::<Vec<i64>>();
        for (index, item) in vec.iter().rev().enumerate() {
            sum += i64::pow(2, index as u32) * item;
        }
        Some(sum)
    }
    pub fn input_string() -> String {
        let mut input = String::new();
        std::io::stdin().read_line(&mut input).unwrap();
        input.trim().to_string()
    }
    pub fn input_num<T>() -> T
    where
        <T as std::str::FromStr>::Err: std::fmt::Debug,
        T: std::str::FromStr,
    {
        let mut input = String::new();
        std::io::stdin().read_line(&mut input).unwrap();
        input.trim().to_string().parse::<T>().unwrap()
    }

    pub fn input_vec_string(split_by: &str) -> Vec<String> {
        let mut input = String::new();
        std::io::stdin().read_line(&mut input).unwrap();
        input
            .trim()
            .split(split_by)
            .filter(|s| !s.is_empty())
            .map(|s| s.trim().to_string())
            .map(|s| s.to_string())
            .collect::<Vec<String>>()
    }
    pub fn input_vec_num<T>(split_by: &str) -> Vec<T>
    where
        <T as std::str::FromStr>::Err: std::fmt::Debug,
        T: std::str::FromStr,
    {
        let mut input = String::new();
        std::io::stdin().read_line(&mut input).unwrap();
        input
            .trim()
            .split(split_by)
            .filter(|s| !s.is_empty())
            .map(|s| s.trim().to_string())
            .map(|s| s.parse::<T>().unwrap())
            .collect::<Vec<T>>()
    }
    pub fn input_loop() -> std::io::Lines<std::io::StdinLock<'static>> {
        use std::io::{self, *};
        let stdin = io::stdin();
        stdin.lock().lines()
    }
}
}

贪心算法

1.1 活动安排

设有 n 个活动的集合 E={1,2,..,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。选择出由互相兼容的活动组成的最大集合。

Simplify: 输出没有交集的区间的总数,Outputs the total number of intervals that do not intersect

输入格式
第一行一个整数 n;
接下来的 n 行,每行两个整数 s_i 和 f_i。

输出格式
输出互相兼容的最大活动个数。

in:
4
1 3
4 6
2 5
1 7
out:
2
#[allow(warnings)]
fn main() {
    let n = lib::input_num::<usize>();
    let mut vec = vec![];
    for _ in 0..n {
        vec.push(lib::input_vec_num::<usize>(" "));
    }
    vec.sort_by_key(|s| s[1]); //sort by end time
    let mut ended = 0;
    let mut count = 0;
    for i in 0..n {
        if vec[i][0] >= ended {
            count += 1;
            ended = vec[i][1];
        }
    }
    println!("{:?}", count);
}

1.2 种树

某条街被划为 n 条路段,这 n 条路段依次编号为 1\dots n。每个路段最多可以种一棵树。现在居民们给出了 h 组建议,每组建议包含三个整数 b,e,t,表示居民希望在路段 b 到 e 之间至少要种 t 棵树。这些建议所给路段的区间可以交叉。请问:如果要满足所有居民的建议,至少要种多少棵树。

输入格式
第一行为 n,表示路段数。
第二行为 h,表示建议数。
下面 h 行描述一条建议:b, e, t,用一个空格分隔。

输出格式
输出只有一个数,为满足所有居民的建议,所需要种树的最少数量。

in:
9
4
1 4 2
4 6 2
8 9 2
3 5 2
out:
5

in:
9
4 
1 4 2 
4 6 1 
8 9 2 
3 5 2 
out:
4