AtCoder Beginner Contest 272 C

https://atcoder.jp/contests/abc272/tasks/abc272_c

Aを偶数と奇数に分ければよいですが、filterを使って簡単に書くとどうしてもVec<&i32>になってしまいます。

    let mut evens = Vec::<i32>::new();
    let mut odds = Vec::<i32>::new();
    for a in A.iter() {
        if a % 2 == 0 {
            evens.push(*a)
        }
        else {
            odds.push(*a);
        }
    }

こういうコードを書けばVecになります。mapを使えばいいですが、1行で収まらないのが。

// Max Even
#![allow(non_snake_case)]

use std::cmp::max;

fn read<T: std::str::FromStr>() -> T {
    let mut line = String::new();
    std::io::stdin().read_line(&mut line).ok();
    line.trim().parse().ok().unwrap()
}

fn read_vec<T: std::str::FromStr>() -> Vec<T> {
    read::<String>().split_whitespace()
            .map(|e| e.parse().ok().unwrap()).collect()
}

fn read_input() -> Vec<i32> {
    let _N: usize = read();
    let A = read_vec();
    A
}

fn max_sum(B: Vec<&i32>) -> i32 {
    if B.len() >= 2 {
        B[B.len()-2] + B[B.len()-1]
    }
    else {
        -1
    }
}

fn f(A: Vec<i32>) -> i32 {
    let mut evens: Vec<&i32> = A.iter().filter(|&a| a % 2 == 0).collect();
    evens.sort();
    let mut odds: Vec<&i32> = A.iter().filter(|&a| a % 2 != 0).collect();
    odds.sort();
    max(max_sum(evens), max_sum(odds))
}

fn main() {
    let A = read_input();
    println!("{}", f(A))
}