https://atcoder.jp/contests/abc416/tasks/abc416_d
足してM以上になるペアをなるべくたくさん作ればよいです。Aを降順、Bを昇順にして、尺取り法的に処理すればよいです。
// Match, Mod, Minimize 2 #![allow(non_snake_case)] //////////////////// library //////////////////// 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() } //////////////////// process //////////////////// fn read_test() -> (i64, Vec<i64>, Vec<i64>) { let v: Vec<i64> = read_vec(); let M = v[1]; let A: Vec<i64> = read_vec(); let B: Vec<i64> = read_vec(); (M, A, B) } fn F_each(M: i64, mut A: Vec<i64>, mut B: Vec<i64>) -> i64 { let N = A.len(); A.sort_by(|a, b| b.cmp(&a)); B.sort(); let mut s = A.iter().sum::<i64>() + B.iter().sum::<i64>(); let mut i: usize = 0; for a in A { while a + B[i] < M { i += 1; if i == N { return s } } s -= M; i += 1; if i == N { break } } s } fn F(T: usize) { for _ in 0..T { let (M, A, B) = read_test(); println!("{}", F_each(M, A, B)) } } fn main() { let T: usize = read(); F(T) }