Skip to content

Commit 27c3fed

Browse files
committed
sec1
0 parents  commit 27c3fed

File tree

7 files changed

+355
-0
lines changed

7 files changed

+355
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/target

Cargo.lock

+88
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[package]
2+
name = "antbook"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7+
8+
[dependencies]
9+
proconio = { version = "=0.4.3", features = ["derive"] }
10+
itertools = "=0.9.0"
11+
12+
[[bin]]
13+
name = "main"
14+
# path = "src/1_1.rs"
15+
# path = "src/1_6_triangle.rs"
16+
# path = "src/1_6_ant.rs"
17+
path = "src/binary_search.rs"

src/1_1.rs

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
use itertools::*;
2+
use proconio::{fastout, input};
3+
4+
#[fastout]
5+
fn main() {
6+
input! {
7+
n: usize,
8+
m: i32,
9+
k: [i32; n]
10+
}
11+
let ans = if solve(n, m, &k) { "Yes" } else { "no" };
12+
println!("{}", ans);
13+
}
14+
15+
// O(n^2 log n^2)
16+
fn solve(_n: usize, m: i32, k: &[i32]) -> bool {
17+
let prod: &Vec<i32> = &k
18+
.iter()
19+
.combinations(2)
20+
.map(|v| v.into_iter().sum())
21+
.sorted()
22+
.collect::<Vec<_>>();
23+
for i in prod {
24+
if let Ok(_) = prod.binary_search(&(m - i)) {
25+
return true;
26+
}
27+
}
28+
return false;
29+
}
30+
31+
// O(n^3 log n)
32+
fn _solve(_n: usize, m: i32, k: &[i32]) -> bool {
33+
for a in k {
34+
for b in k {
35+
for c in k {
36+
let d = m - a - b - c;
37+
if let Ok(_) = k.binary_search(&d) {
38+
return true;
39+
}
40+
}
41+
}
42+
}
43+
return false;
44+
}
45+
46+
// O(n^4)
47+
fn __solve(_n: usize, m: i32, k: &[i32]) -> bool {
48+
for a in k {
49+
for b in k {
50+
for c in k {
51+
for d in k {
52+
if a + b + c + d == m {
53+
return true;
54+
}
55+
}
56+
}
57+
}
58+
}
59+
return false;
60+
}
61+
62+
#[cfg(test)]
63+
mod tests {
64+
use super::solve;
65+
66+
#[test]
67+
fn example1() {
68+
assert_eq!(solve(3, 10, &[1, 3, 5]), true);
69+
}
70+
#[test]
71+
fn example2() {
72+
assert_eq!(solve(3, 9, &[1, 3, 5]), false);
73+
}
74+
}

src/1_6_ant.rs

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
use std::cmp::*;
2+
3+
use proconio::{fastout, input};
4+
5+
#[fastout]
6+
fn main() {
7+
input! {
8+
l: i32,
9+
n: usize,
10+
x: [i32; n]
11+
}
12+
let (min, max) = solve(l, n, &x);
13+
println!("min = {}", min);
14+
println!("max = {}", max);
15+
}
16+
17+
fn solve(l: i32, _n: usize, x: &[i32]) -> (i32, i32) {
18+
let min = x.iter().map(|&x| min(x, l - x)).max().unwrap();
19+
let max = x.iter().map(|&x| max(x, l - x)).max().unwrap();
20+
return (min, max);
21+
}
22+
23+
fn _solve(l: i32, _n: usize, x: &[i32]) -> (i32, i32) {
24+
let min = (l/2) - x.iter().map(|x| (x - (l/2)).abs()).min().unwrap();
25+
let max = (l/2) + x.iter().map(|x| (x - (l/2)).abs()).max().unwrap();
26+
return (min, max);
27+
}
28+
29+
#[cfg(test)]
30+
mod tests {
31+
use super::solve;
32+
33+
#[test]
34+
fn example1() {
35+
assert_eq!(solve(10, 3, &[2, 6, 7]), (4, 8));
36+
}
37+
}

src/1_6_triangle.rs

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
use std::cmp::Reverse;
2+
3+
use proconio::{input, fastout};
4+
5+
#[fastout]
6+
fn main() {
7+
input!{
8+
n: usize,
9+
mut a: [i32; n]
10+
}
11+
println!("{}", solve(n, &mut a));
12+
}
13+
14+
15+
fn solve(n: usize, a: &mut [i32]) -> i32 {
16+
a.sort_by_key(|w| Reverse(*w));
17+
for i in 0..n-2 {
18+
if a[i] < a[i+1] + a[i+2] {
19+
return a[i] + a[i+1] + a[i+2];
20+
}
21+
}
22+
return 0;
23+
}
24+
25+
fn _solve(n: usize, a: &mut [i32]) -> i32 {
26+
a.sort_by_key(|w| Reverse(*w));
27+
for i in 0..n {
28+
for j in i+1..n {
29+
for k in j+1..n {
30+
if a[i] < a[j] + a[k] {
31+
return a[i] + a[j] + a[k];
32+
}
33+
}
34+
}
35+
}
36+
return 0;
37+
}
38+
39+
#[cfg(test)]
40+
mod tests {
41+
use super::solve;
42+
43+
#[test]
44+
fn example1() {
45+
assert_eq!(solve(5, &mut [2, 3, 4, 5, 10]), 12);
46+
}
47+
#[test]
48+
fn example2() {
49+
assert_eq!(solve(4, &mut [4, 5, 10, 20]), 0);
50+
}
51+
}

src/binary_search.rs

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
use proconio::{fastout, input};
2+
3+
#[fastout]
4+
fn main() {
5+
input! {
6+
n: usize,
7+
x: usize,
8+
xs: [usize; n]
9+
}
10+
println!("{:?}", xs.lower_bound(&x));
11+
}
12+
pub trait BinarySearch<T> {
13+
fn lower_bound(&self, x: &T) -> usize;
14+
fn upper_bound(&self, x: &T) -> usize;
15+
}
16+
17+
impl<T: Ord> BinarySearch<T> for [T] {
18+
// x 以上の要素のうち最初の要素の添字を返す。
19+
// xs には昇順ソート済みを想定する。
20+
fn lower_bound(&self, x: &T) -> usize {
21+
let mut left = 0;
22+
let mut right = self.len();
23+
while left != right {
24+
let mid = (left + right) / 2;
25+
if &self[mid] < x {
26+
left = mid + 1;
27+
} else {
28+
right = mid;
29+
}
30+
}
31+
left
32+
}
33+
34+
// x より大きい要素のうち最初の要素の添字を返す。
35+
// xs には昇順ソート済みを想定する。
36+
fn upper_bound(&self, x: &T) -> usize {
37+
let mut left = 0;
38+
let mut right = self.len();
39+
while left != right {
40+
let mid = (left + right) / 2;
41+
if &self[mid] <= x {
42+
left = mid + 1;
43+
} else {
44+
right = mid;
45+
}
46+
}
47+
left
48+
}
49+
}
50+
51+
#[cfg(test)]
52+
mod tests {
53+
use super::*;
54+
55+
#[test]
56+
fn lower1_found_exact() {
57+
assert_eq!([1, 2, 3, 4, 5].lower_bound(&3), 2);
58+
}
59+
#[test]
60+
fn lower2_found_exact_dup() {
61+
assert_eq!([1, 2, 3, 3, 3, 4, 5].lower_bound(&3), 2);
62+
}
63+
#[test]
64+
fn lower3_found_not_exact() {
65+
assert_eq!([1, 2, 4, 5].lower_bound(&3), 2);
66+
}
67+
#[test]
68+
fn lower4_not_found() {
69+
assert_eq!([1, 2, 2].lower_bound(&3), 3);
70+
}
71+
#[test]
72+
fn upper1_found_exact() {
73+
assert_eq!([1, 2, 3, 4, 5].upper_bound(&3), 3);
74+
}
75+
#[test]
76+
fn upper2_found_exact_dup() {
77+
assert_eq!([1, 2, 3, 3, 3, 4, 5].upper_bound(&3), 5);
78+
}
79+
#[test]
80+
fn upper3_found_not_exact() {
81+
assert_eq!([1, 2, 4, 5].upper_bound(&3), 2);
82+
}
83+
#[test]
84+
fn upper4_not_found() {
85+
assert_eq!([1, 2, 2].upper_bound(&3), 3);
86+
}
87+
}

0 commit comments

Comments
 (0)