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