1use rand::Rng;
2use std::path::PathBuf;
3
4const SOLUTION: &str = r"
5#include <iostream>
6using namespace std;
7int main() {
8 int n;
9 cin >> n;
10 int a[n];
11 for (int i = 0; i < n; i++) {
12 cin >> a[i];
13 }
14
15 // Sort the array
16 sort(a, a + n);
17
18 // Find the smallest sum that cannot be formed
19 int smallest_sum = 1;
20 for (int i = 0; i < n; i++) {
21 if (a[i] > smallest_sum) {
22 break;
23 }
24 smallest_sum += a[i];
25 }
26
27 cout << smallest_sum << endl;
28 return 0;
29}
30";
31
32fn main() {
33 let mut task = ezcp::Task::new("Coins", &PathBuf::from("task2"));
37 task.solution_source = SOLUTION.to_owned();
38
39 let mut subtask1 = ezcp::Subtask::new();
41
42 subtask1.set_checker(|mut input| {
43 let array = input.get_array()?;
44 input.expect_end()?;
45 let n = array.len();
46 if n != 1 {
47 ezcp::bail!("n should be 1");
48 }
49 let x = array[0];
50 if !(1..=1_000_000_000).contains(&x) {
51 ezcp::bail!("all array values should be in range [1, 1_000_000_000]");
52 }
53 Ok(())
54 });
55
56 subtask1.add_test(5, ezcp::array_generator(1, 1, 1, 1000));
57 subtask1.add_test_str("1\n 1\n".to_owned());
58
59 let mut subtask2 = ezcp::Subtask::new();
61
62 subtask2.set_checker(|mut input| {
63 let array = input.get_array()?;
64 input.expect_end()?;
65 let n = array.len();
66 if !(1..=30).contains(&n) {
67 ezcp::bail!("n should be in range [1, 30]");
68 }
69 for (i, x) in array.iter().enumerate() {
70 if *x != 1 << i {
71 ezcp::bail!("all array values should be powers of 2");
72 }
73 }
74 Ok(())
75 });
76
77 subtask2.add_test(5, || {
78 let mut rng = rand::rng();
79 let n = rng.random_range(1..=30);
80 let mut array = Vec::new();
81 for i in 0..n {
82 array.push(1 << i);
83 }
84 ezcp::array_to_string(&array, true)
85 });
86
87 let mut subtask3 = ezcp::Subtask::new();
89
90 subtask3.set_checker(|mut input| {
91 let array = input.get_array()?;
92 input.expect_end()?;
93 let n = array.len();
94 if !(1..=1000).contains(&n) {
95 ezcp::bail!("n should be in range [1, 1000]");
96 }
97 for x in array {
98 if !(1..=1_000_000_000).contains(&x) {
99 ezcp::bail!("all array values should be in range [1, 1_000_000_000]");
100 }
101 }
102 Ok(())
103 });
104
105 subtask3.add_test(5, ezcp::array_generator(1, 1000, 1, 1000));
106 subtask3.add_test(5, ezcp::array_generator(1, 1000, 1, 1_000_000_000));
107 subtask3.add_test(5, ezcp::array_generator(1, 1000, 1, 1));
108 subtask3.add_test(5, ezcp::array_generator(1000, 1000, 1, 1000));
109 subtask3.add_test(5, ezcp::array_generator(1000, 1000, 1, 1_000_000_000));
110 subtask3.add_test(1, ezcp::array_generator(1000, 1000, 1, 1));
111
112 let mut subtask4 = ezcp::Subtask::new();
114
115 subtask4.set_checker(|mut input| {
116 let array = input.get_array()?;
117 input.expect_end()?;
118 let n = array.len();
119 if !(1..=200_000).contains(&n) {
120 ezcp::bail!("n should be in range [1, 200_000]");
121 }
122 for x in array {
123 if !(1..=1_000_000_000).contains(&x) {
124 ezcp::bail!("all array values should be in range [1, 1_000_000_000]");
125 }
126 }
127 Ok(())
128 });
129
130 subtask4.add_test(5, ezcp::array_generator(1, 200_000, 1, 1000));
131 subtask4.add_test(5, ezcp::array_generator(1, 200_000, 1, 1_000_000_000));
132 subtask4.add_test(5, ezcp::array_generator(1, 200_000, 1, 1));
133 subtask4.add_test(5, ezcp::array_generator(200_000, 200_000, 1, 1000));
134 subtask4.add_test(5, ezcp::array_generator(200_000, 200_000, 1, 1_000_000_000));
135 subtask4.add_test(1, ezcp::array_generator(200_000, 200_000, 1, 1));
136
137 let subtask1 = task.add_subtask(subtask1);
139 let subtask2 = task.add_subtask(subtask2);
140 let subtask3 = task.add_subtask(subtask3);
141 let subtask4 = task.add_subtask(subtask4);
142
143 task.add_subtask_dependency(subtask3, subtask1);
145 task.add_subtask_dependency(subtask3, subtask2);
146 task.add_subtask_dependency(subtask4, subtask3);
147
148 task.create_tests().ok();
149}