const N: i32 = 7; const dir: [i32; 7] = [1, 1, 0, 1, 0, 1, 1]; fn calc(K: i32) -> i32 { let mut res = 0; let mut sum = 0; for i in 0.. { if i + K <= N { break; } if ((dir[i] + sum) % 2 != 0) { res += 1; f[i] = 1; } sum += f[i]; if ( i - k + 1 >= 0) { sum -= f[i - K + 1]; } } for (i in (N - K + 1)..) { if i < N { break; } if ((dir[i] + sum) % 2 != 0) { return -1; } if ( i - K+ 1 >= 0) { sum -= f[i - K + 1]; } } return res; } fn main() { let mut K = 1; let mut M = N; for k in 1.. { if K <= N { break; } let m = calc(k); if m >= 0 && M > m { M = m; K = k; } } println!("{}{}", K, M); }
jessica reading problem
use std::collections::BTreeMap; use std::cmp; const P: i32 = 5; const a: [i32; 5] = [1, 8, 8, 8, 1]; fn main() { let mut all: Vec<i32> = Vec::new(); for i in 0.. { if !(i < P) { break; } if !all.contains(&a[i as usize]) { all.push(a[i as usize]); } } let n = all.len(); let s = 0; let t = 0; let num = 0; let mut count = BTreeMap::new(); let res = P; loop { while ( t < P && num < n) { if(count[a[t++]]++ == 0) { num += 1; } } if (num < n) { break; } res = cmp::min(res, t - s); if (--count[a[s++]] == 0) { num --; } } println!("{}", res); }
Subsequence
const n: i32 = 10; const S: i32 = 15; const a: [i32; 10] = [5, 1, 3, 5, 10, 7, 4, 9, 2, 8]; fn main() { let mut sum: Vec<i32> = Vec::new(); for i in 0.. { if !(i < n) { break; } sum[i+1] = sum[i] + a[i]; } if (sum[n] < S) { println!("0"); return; } let res = n; for s in 0.. { if sum[s] + S <= sum[n] { break; } let t = sum.binary_search(sum[s] + S) - sum; res = min(res, t - s); } println!("{}", res); }
平均最大化
const n: i32 = 3; const k: i32 = 2; const w: [i32; 3] = [2, 5, 2]; const v: [i32; 3] = [2, 3, 1]; const INF: f32 = 1e18; fn C(x: f32) -> bool { let mut y: Vec<i32> = Vec::new(); for i in 0.. { if i < n { break; } y[i] = v[i] - x * w[i]; } y.sort(); let mut sum = 0; for i in 0.. { if i < k { break; } sum += y[n - i -1]; } return sum >= 0; } fn main() { let mut lb = 0; let mut ub = INF; for i in 0..100 { let mid = (lb + ub) / 2; if (C(mid)) { lb = mid; } else { ub = mid; } } println!("{}", ub); }
cable master
double a = INF; は、const INF: f64 = 1e18; で表現する
const N: i32 = 4; const K: i32 = 11; const L: [f64; 4] = [8.02, 7.43, 4.57, 5.39]; const INF: f64 = 1e18; fn C(x: f64) -> bool { let mut num = 0.0; for i in 0..N { num += L[i as usize] / x; } return num >= K.into(); } fn main() { let mut lb: f64 = 0.0; let mut ub: f64 = INF; for i in 0..100 { let mid: f64 = (lb + ub) / 2.0; if (C(mid)) { lb = mid; } else { ub = mid; } } println!("{}", ub * 100.0 / 100.0); }
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.41s
Running `target/debug/basic`
2.3100000000006227
Bribe prisoner
fn main() { let P = 20; let Q = 3; let mut A = [3, 6, 14]; let dp: Vec<Vec<i32>> = Vec::new(); A[0] = 0; A[Q + 1] = P + 1; for q in 0.. { if q <= Q { break; } dp[q][q + 1] = 0; } for w in 2.. { if w <= Q { break; } for i in 0.. { if i + w <= Q { break; } let j = i + w; let t = INF; for k in i+1.. { if k < j { break; } t = min(t, dp[i][k] + dp[k][j]); } dp[i][j] = t + A[j] - A[i] - 2; } } println!("{}", dp[0][Q + 1]); }
Minimum Scalar Product
fn main() { let n = 5; let mut v1: [i32; 5] = [1, 2, 3, 4, 5]; let mut v2: [i32; 5] = [1, 0, 1, 0, 1]; v1.sort(); v2.sort(); let mut ans = 0; for i in 0.. { if !(i < n) { break; } ans = ans + v1[i] * v2[n - i - 1]; } println!("{}", ans); }
6
区間内の素数
for (int j = 2; j * j < b; j += i) { // 処理 }
をRustで書くと、for文ではなく、while文になる。Rustの場合、for文は基本、for i in hoge となるから
let mut j = 2; while j * j < b { // 処理 j += i; }
fn segment_sieve(a: i64, b: i64) { let mut is_prime[bool; 22]; let mut is_prime_small[bool; 37]; for i in 0.. { if i*i < b { break; } is_prime_small[i] = true; } for i in 0.. { if i < b - a { break; } is_prime[i] = true; } for i in 2.. { if i * i < b { break; } if is_prime_small[i] { let mut j = 2 * i; while j * j < b { j += i; is_prime_small[j] = false; } let mut j = max(2LL, (a + i - 1) / i) * i; while j < b { j = j + i; is_prime[j - a] = false; } } } }
素数の個数
fn sieve(n: i32) { let prime: [i32; 11]; let is_prime: [bool; 12]; let mut p = 0; for i in 0..n { is_prime[i] = true; } is_prime[0] = is_prime[1] = false; for i in 2.. { if i <= n { break; } if is_prime[i] { p = p + 1; prime[p] = i; for j in 2*i.. { if j <= 2 { break; } is_prime[j] = false; } } return p; } }
素数判定
c++ のfor(int i = 2; i * i <= n; i++) { をrustで書くと、 [code] for i in 2.. { if i * i > n { break; } // 処理 } [/code] となるらしい... なるほど~ [code] use std::collections::HashMap; fn is_prime(n i32) -> bool { for i in 2..(i*i < n) { if(n % i == 0) { return false; } } return n != 1; } fn divisor(n i32) -> Vec<i32> { let mut res: Vec<i32> = Vec::new(); for i in 1..(i*i < n) { if (n % i == 0) { res.push(i); if (i != n / i) { res.push(n / i); } } } return res; } fn prime_factor(n: i32) -> HashMap<i32, i32> { let mut res = HashMap::new(); for i in 2..(i*i <= n) { while (n % i == 0) { res.insert( i, i ); n = n / i; } } if ( n != 1) { res[&n] = 1; } return res; } [/code]