diff --git a/abc079/Cargo.lock b/abc079/Cargo.lock index 7720f455..0a49fa55 100644 --- a/abc079/Cargo.lock +++ b/abc079/Cargo.lock @@ -4,16 +4,100 @@ name = "abc079" version = "0.1.0" dependencies = [ + "num", "proconio", "superslice", ] +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +[[package]] +name = "num" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" +dependencies = [ + "autocfg", + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + [[package]] name = "proc-macro2" version = "0.4.30" @@ -35,9 +119,9 @@ dependencies = [ [[package]] name = "proconio-derive" -version = "0.1.6" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2f2111a9562adf5ba291143c434818c908a05636c8a492a0a69ba4720a2c16" +checksum = "8096c9313b401ca5bf09f93235fdf4fe6dbedc4f64e3968d2688bf89433a6738" dependencies = [ "proc-macro2", "quote", diff --git a/abc079/Cargo.toml b/abc079/Cargo.toml index 545af87c..368c55ca 100644 --- a/abc079/Cargo.toml +++ b/abc079/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "abc079" version = "0.1.0" -authors = ["bouzuya "] edition = "2018" # dependencies added to new project [dependencies] +num = "=0.2.1" proconio = { version = "=0.3.6", features = ["derive"] } superslice = "=1.0.0" diff --git a/abc079/src/bin/a.rs b/abc079/src/bin/a.rs index c9b271ba..8ddf973b 100644 --- a/abc079/src/bin/a.rs +++ b/abc079/src/bin/a.rs @@ -1,10 +1,9 @@ -use proconio::input; -use proconio::marker::Chars; +use proconio::{input, marker::Chars}; fn main() { input! { n: Chars, }; - let ans = (n[0] == n[1] && n[0] == n[2]) || (n[1] == n[2] && n[1] == n[3]); + let ans = (n[0] == n[1] && n[1] == n[2]) || (n[1] == n[2] && n[2] == n[3]); println!("{}", if ans { "Yes" } else { "No" }); } diff --git a/abc079/src/bin/b.rs b/abc079/src/bin/b.rs index 173f9012..18e05eb8 100644 --- a/abc079/src/bin/b.rs +++ b/abc079/src/bin/b.rs @@ -2,14 +2,13 @@ use proconio::input; fn main() { input! { - n: usize + n: usize, }; - let mut l = vec![0_usize; n + 1]; - l[0] = 2; - l[1] = 1; - for i in 2..=n { - l[i] = l[i - 1] + l[i - 2]; + let mut x = (2_usize, 1_usize); + for _ in 2..=n { + let (l_i_2, l_i_1) = x; + x = (l_i_1, l_i_1 + l_i_2); } - let ans = l[n]; + let ans = x.1; println!("{}", ans); } diff --git a/abc079/src/bin/c.rs b/abc079/src/bin/c.rs index 490b3067..607af14f 100644 --- a/abc079/src/bin/c.rs +++ b/abc079/src/bin/c.rs @@ -1,48 +1,31 @@ -use proconio::input; -use proconio::marker::Chars; - -fn dfs(d: &Vec, o: &mut Vec) -> Option> { - if o.len() == d.len() - 1 { - let mut r = d[0]; - for (&o_i, &d_i) in o.iter().zip(d.iter().skip(1)) { - if o_i { - r += d_i; - } else { - r -= d_i; - } - } - return if r == 7 { Some(o.to_vec()) } else { None }; - } - - o.push(true); - if let Some(o) = dfs(d, o) { - return Some(o); - } - o.pop(); - o.push(false); - if let Some(o) = dfs(d, o) { - return Some(o); - } - o.pop(); - None -} +use proconio::{input, marker::Chars}; fn main() { input! { - abcd: Chars + abcd: Chars, }; - let d = abcd - .iter() - .map(|&c| c.to_digit(10).unwrap() as i64) - .collect::>(); - match dfs(&d, &mut vec![]) { - None => unreachable!(), - Some(o) => { - print!("{}", d[0]); - for (&o_i, &d_i) in o.iter().zip(d.iter().skip(1)) { - print!("{}{}", if o_i { "+" } else { "-" }, d_i); + let a = (abcd[0] as u8 - b'0') as i64; + let b = (abcd[1] as u8 - b'0') as i64; + let c = (abcd[2] as u8 - b'0') as i64; + let d = (abcd[3] as u8 - b'0') as i64; + + for op_1 in vec![1, -1] { + for op_2 in vec![1, -1] { + for op_3 in vec![1, -1] { + if (((a + op_1 * b) + op_2 * c) + op_3 * d) == 7 { + println!( + "{}{}{}{}{}{}{}=7", + a, + if op_1 == 1 { '+' } else { '-' }, + b, + if op_2 == 1 { '+' } else { '-' }, + c, + if op_3 == 1 { '+' } else { '-' }, + d + ); + return; + } } - println!("=7"); } } } diff --git a/abc079/src/bin/d.rs b/abc079/src/bin/d.rs index ca7199ce..692dd520 100644 --- a/abc079/src/bin/d.rs +++ b/abc079/src/bin/d.rs @@ -1,19 +1,20 @@ use proconio::input; -fn dijkstra(n: usize, inf: u64, e: &Vec>, s: usize) -> Vec { +fn dijkstra(n: usize, inf: usize, e: &[Vec<(usize, usize)>], s: usize) -> Vec { + use std::{cmp::Reverse, collections::BinaryHeap}; let mut d = vec![inf; n]; - let mut pq = std::collections::BinaryHeap::new(); + let mut pq = BinaryHeap::new(); d[s] = 0; - pq.push(std::cmp::Reverse((0, s))); - while let Some(std::cmp::Reverse((w_u, u))) = pq.pop() { + pq.push(Reverse((0, s))); + while let Some(Reverse((w_u, u))) = pq.pop() { if w_u > d[u] { continue; } - for &(v, w_v) in e[u].iter() { + for (v, w_v) in e[u].iter().copied() { let w = w_u + w_v; if w < d[v] { d[v] = w; - pq.push(std::cmp::Reverse((w, v))); + pq.push(Reverse((w, v))); } } } @@ -24,32 +25,32 @@ fn main() { input! { h: usize, w: usize, - c: [[u64; 10]; 10], + c: [[usize; 10]; 10], a: [[i64; w]; h], }; - let mut e = vec![vec![]; 10]; - for (i, c_i) in c.iter().enumerate() { - for (j, &c_ij) in c_i.iter().enumerate() { - if i == j { - continue; - } - e[i].push((j, c_ij)); + + let mut edges = vec![vec![]; 10]; + for i in 0..10 { + for j in 0..10 { + edges[i].push((j, c[i][j])); } } - let inf = 1_000_000_u64; - let mut d = vec![]; + + let mut dists = vec![]; for i in 0..10 { - d.push(dijkstra(10, inf, &e, i)); + let d = dijkstra(10, 1 << 60, &edges, i); + dists.push(d[1]); } - let mut ans = 0; - for a_i in a.iter() { - for &a_ij in a_i.iter() { - match a_ij { - -1 | 1 => {} // do nothing - 0 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 => ans += d[a_ij as usize][1], - _ => unreachable!(), + + let mut ans = 0_usize; + for i in 0..h { + for j in 0..w { + if a[i][j] == -1 { + continue; } + ans += dists[a[i][j] as usize]; } } + println!("{}", ans); }