开始整卷作答
按大题分页,翻页自动存草稿,做完统一交卷。
## 一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)
第 1–15 题 · 共 15 题
## 二、阅读程序(判断题1分,选择题3分,共计40分)
判断题正确填 `T`,错误填 `F`。
### 第1题
```cpp
void solve(int n, int a[])
{
while (true)
{
bool found = false;
for (int i = 0; i + 1 < n; ++i)
{
if (a[i] > a[i+1])
{
found = true;
int temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
if (not found) {
break;
}
}
}
```
#### 判断题
第 16–19 题 · 共 4 题
#### 选择题
第 20–22 题 · 共 3 题
### 第2题
```cpp
long long solve(long long n)
{
long long c = 0;
long long p = 1;
long long t = 0;
while (n > 0)
{
int d = n % 10;
n /= 10;
if (d > 0)
{
c += n * p;
}
else
{
c += (n-1) * p;
c += t + 1;
}
t += d * p;
p *= 10;
}
return c;
}
```
#### 判断题
第 23–24 题 · 共 2 题
#### 选择题
第 25–27 题 · 共 3 题
### 第三题
```cpp
#include<iostream>
int n, q;
char op[200000];
long long p[200000];
long long d[200000];
long long mod = 1000000007;
void solve1(long long a[])
{
for (int i = 0; i < n; ++i)
a[i] = 0;
for (int i = 0; i < q; ++i) {
if (op[i] == '+') {
a[p[i]] += d[i];
a[p[i]] %= mod;
}
else if (op[i] == '*') {
for (int j = 0; j < n; ++j) {
a[j] *= d[i];
a[j] %= mod;
}
}
}
}
void solve2(long long a[])
{
for (int i = 0; i < n; ++i)
a[i] = 0;
long long f = 1;
for (int i = q-1; i >= 0; i--) {
if (op[i] == '+') {
a[p[i]] += d[i] * f;
a[p[i]] %= mod;
}
else if (op[i] == '*') {
f *= d[i];
f %= mod;
}
}
}
```
#### 判断题
第 28–31 题 · 共 4 题
#### 选择题
第 32–35 题 · 共 4 题
## 三、完善程序(单选题,每小题3分,共计30分)
### 第1题
炼制一块合金,该合金需要 $a$ 克黄金与 $b$ 克白银。商店里有 $n$ 块材料,第 $i$ 块材料含有 $x_i$ 克黄金与 $y_i$ 克白银,且含有 $w_i$ 克杂质。
请问应该使用哪些材料,将它们炼制在一起,才能使得合金中黄金与白银含量不少于给定的要求,且杂质总和最小。所有材料均不可切割。输入数据保证所要求的合金一定可以炼成。
```cpp
int n, a, b;
int x[maxn], y[maxn], w[maxn];
int mem[maxn][maxm][maxm];
bool cache[maxn][maxm][maxm];
const int INF = 1000000000;
int dfs(int k, int i, int j) {
if (____(1)____) return 0;
if (____(2)____) return INF;
if (cache[k][i][j]) return mem[k][i][j];
int ni = ____(3)____;
int nj = ____(4)____;
int giveup = ____(5)____;
int pickup = ____(6)____;
cache[k][i][j] = true;
return mem[k][i][j] = std::min(giveup,pickup);
}
int main() {
std::cin >> n >> a >> b;
for (int i = 0; i < n; ++i)
std::cin >> x[i] >> y[i] >> w[i];
std::cout << ____(7)____ << "\n";
return 0;
}
```
第 36–40 题 · 共 5 题
### 第2题
给定一个整数序列 $a_1,a_2,\ldots,a_n$,对该序列的所有子区间,分别算出它们的中位数,并且将这些中位数组成一个新序列,输出这个新序列的中位数。
所谓一个序列的中位数,就是将这个序列排序后,排名在最中间的数字,如果序列的长度是偶数,规定中位数是排名最居中的两个数之中偏大的数。
```cpp
#include<iostream>
const int maxn = 1000000;
int a[maxn];
int b[maxn];
int s[maxn + 1];
int n;
long long total;
long long merge(int begin, int mid, int end) {
int buffer[end - begin];
auto i = begin;
auto j = mid;
auto k = 0;
long long sum = 0;
while (i < mid and j < end) {
if (s[i] <= s[j]) {
buffer[k++] = s[i++];
sum += ____(1)____;
}
else {
buffer[k++] = s[j++];
}
}
while (i < mid) buffer[k++] = s[i++];
while (j < end) buffer[k++] = s[j++];
for (int x = begin, k = 0; x < end; ++x, ++k)
s[x] = buffer[k];
return sum;
}
long long merge_sort(int begin, int end) {
auto length = end - begin;
if (____(2)____) return 0;
auto mid = begin + length / 2;
auto front = merge_sort(begin, mid);
auto back = merge_sort(mid, end);
auto cross = merge(begin, mid, end);
return ____(3)____;
}
bool predicate(int key) {
for (int i = 0; i < n; ++i) {
if (____(4)____)
b[i] = 1;
else
b[i] = -1;
s[i+1] = s[i] + b[i];
}
long long num = ____(5)____;
return ____(6)____;
}
int main() {
std::cin >> n;
for (int i = 0; i < n; ++i) std::cin >> a[i];
total = (long long)n * (n + 1) / 2;
int begin = 0;
int end = 1000000001;
while (true) {
int length = ____(7)____;
if (length == 1) break;
auto mid = ____(8)____;
if (predicate(mid))
begin = mid;
else
end = mid;
}
std::cout << ____(9)____ << "\n";
}
```
第 41–45 题 · 共 5 题
展开逐题清单(单独练某一道)
● 绿=已通过 ● 橙=做过没全对 ● 灰=没做过
## 一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)
1.
珅泽教育CSP-J第一轮模拟考第九套 第 1 题
2.
珅泽教育CSP-J第一轮模拟考第九套 第 2 题
3.
珅泽教育CSP-J第一轮模拟考第九套 第 3 题
4.
珅泽教育CSP-J第一轮模拟考第九套 第 4 题
5.
珅泽教育CSP-J第一轮模拟考第九套 第 5 题
6.
珅泽教育CSP-J第一轮模拟考第九套 第 6 题
7.
珅泽教育CSP-J第一轮模拟考第九套 第 7 题
8.
珅泽教育CSP-J第一轮模拟考第九套 第 8 题
9.
珅泽教育CSP-J第一轮模拟考第九套 第 9 题
10.
珅泽教育CSP-J第一轮模拟考第九套 第 10 题
11.
珅泽教育CSP-J第一轮模拟考第九套 第 11 题
12.
珅泽教育CSP-J第一轮模拟考第九套 第 12 题
13.
珅泽教育CSP-J第一轮模拟考第九套 第 13 题
14.
珅泽教育CSP-J第一轮模拟考第九套 第 14 题
15.
珅泽教育CSP-J第一轮模拟考第九套 第 15 题
## 二、阅读程序(判断题1分,选择题3分,共计40分)
判断题正确填 `T`,错误填 `F`。
### 第1题
```cpp
void solve(int n, int a[])
{
while (true)
{
bool found = false;
for (int i = 0; i + 1 < n; ++i)
{
if (a[i] > a[i+1])
{
found = true;
int temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
if (not found) {
break;
}
}
}
```
#### 判断题
16.
珅泽教育CSP-J第一轮模拟考第九套 第 16 题
17.
珅泽教育CSP-J第一轮模拟考第九套 第 17 题
18.
珅泽教育CSP-J第一轮模拟考第九套 第 18 题
19.
珅泽教育CSP-J第一轮模拟考第九套 第 19 题
#### 选择题
20.
珅泽教育CSP-J第一轮模拟考第九套 第 20 题
21.
珅泽教育CSP-J第一轮模拟考第九套 第 21 题
22.
珅泽教育CSP-J第一轮模拟考第九套 第 22 题
### 第2题
```cpp
long long solve(long long n)
{
long long c = 0;
long long p = 1;
long long t = 0;
while (n > 0)
{
int d = n % 10;
n /= 10;
if (d > 0)
{
c += n * p;
}
else
{
c += (n-1) * p;
c += t + 1;
}
t += d * p;
p *= 10;
}
return c;
}
```
#### 判断题
23.
珅泽教育CSP-J第一轮模拟考第九套 第 23 题
24.
珅泽教育CSP-J第一轮模拟考第九套 第 24 题
#### 选择题
25.
珅泽教育CSP-J第一轮模拟考第九套 第 25 题
26.
珅泽教育CSP-J第一轮模拟考第九套 第 26 题
27.
珅泽教育CSP-J第一轮模拟考第九套 第 27 题
### 第三题
```cpp
#include<iostream>
int n, q;
char op[200000];
long long p[200000];
long long d[200000];
long long mod = 1000000007;
void solve1(long long a[])
{
for (int i = 0; i < n; ++i)
a[i] = 0;
for (int i = 0; i < q; ++i) {
if (op[i] == '+') {
a[p[i]] += d[i];
a[p[i]] %= mod;
}
else if (op[i] == '*') {
for (int j = 0; j < n; ++j) {
a[j] *= d[i];
a[j] %= mod;
}
}
}
}
void solve2(long long a[])
{
for (int i = 0; i < n; ++i)
a[i] = 0;
long long f = 1;
for (int i = q-1; i >= 0; i--) {
if (op[i] == '+') {
a[p[i]] += d[i] * f;
a[p[i]] %= mod;
}
else if (op[i] == '*') {
f *= d[i];
f %= mod;
}
}
}
```
#### 判断题
28.
珅泽教育CSP-J第一轮模拟考第九套 第 28 题
29.
珅泽教育CSP-J第一轮模拟考第九套 第 29 题
30.
珅泽教育CSP-J第一轮模拟考第九套 第 30 题
31.
珅泽教育CSP-J第一轮模拟考第九套 第 31 题
#### 选择题
32.
珅泽教育CSP-J第一轮模拟考第九套 第 32 题
33.
珅泽教育CSP-J第一轮模拟考第九套 第 33 题
34.
珅泽教育CSP-J第一轮模拟考第九套 第 34 题
35.
珅泽教育CSP-J第一轮模拟考第九套 第 35 题
## 三、完善程序(单选题,每小题3分,共计30分)
### 第1题
炼制一块合金,该合金需要 $a$ 克黄金与 $b$ 克白银。商店里有 $n$ 块材料,第 $i$ 块材料含有 $x_i$ 克黄金与 $y_i$ 克白银,且含有 $w_i$ 克杂质。
请问应该使用哪些材料,将它们炼制在一起,才能使得合金中黄金与白银含量不少于给定的要求,且杂质总和最小。所有材料均不可切割。输入数据保证所要求的合金一定可以炼成。
```cpp
int n, a, b;
int x[maxn], y[maxn], w[maxn];
int mem[maxn][maxm][maxm];
bool cache[maxn][maxm][maxm];
const int INF = 1000000000;
int dfs(int k, int i, int j) {
if (____(1)____) return 0;
if (____(2)____) return INF;
if (cache[k][i][j]) return mem[k][i][j];
int ni = ____(3)____;
int nj = ____(4)____;
int giveup = ____(5)____;
int pickup = ____(6)____;
cache[k][i][j] = true;
return mem[k][i][j] = std::min(giveup,pickup);
}
int main() {
std::cin >> n >> a >> b;
for (int i = 0; i < n; ++i)
std::cin >> x[i] >> y[i] >> w[i];
std::cout << ____(7)____ << "\n";
return 0;
}
```
36.
珅泽教育CSP-J第一轮模拟考第九套 第 36 题
37.
珅泽教育CSP-J第一轮模拟考第九套 第 37 题
38.
珅泽教育CSP-J第一轮模拟考第九套 第 38 题
39.
珅泽教育CSP-J第一轮模拟考第九套 第 39 题
40.
珅泽教育CSP-J第一轮模拟考第九套 第 40 题
### 第2题
给定一个整数序列 $a_1,a_2,\ldots,a_n$,对该序列的所有子区间,分别算出它们的中位数,并且将这些中位数组成一个新序列,输出这个新序列的中位数。
所谓一个序列的中位数,就是将这个序列排序后,排名在最中间的数字,如果序列的长度是偶数,规定中位数是排名最居中的两个数之中偏大的数。
```cpp
#include<iostream>
const int maxn = 1000000;
int a[maxn];
int b[maxn];
int s[maxn + 1];
int n;
long long total;
long long merge(int begin, int mid, int end) {
int buffer[end - begin];
auto i = begin;
auto j = mid;
auto k = 0;
long long sum = 0;
while (i < mid and j < end) {
if (s[i] <= s[j]) {
buffer[k++] = s[i++];
sum += ____(1)____;
}
else {
buffer[k++] = s[j++];
}
}
while (i < mid) buffer[k++] = s[i++];
while (j < end) buffer[k++] = s[j++];
for (int x = begin, k = 0; x < end; ++x, ++k)
s[x] = buffer[k];
return sum;
}
long long merge_sort(int begin, int end) {
auto length = end - begin;
if (____(2)____) return 0;
auto mid = begin + length / 2;
auto front = merge_sort(begin, mid);
auto back = merge_sort(mid, end);
auto cross = merge(begin, mid, end);
return ____(3)____;
}
bool predicate(int key) {
for (int i = 0; i < n; ++i) {
if (____(4)____)
b[i] = 1;
else
b[i] = -1;
s[i+1] = s[i] + b[i];
}
long long num = ____(5)____;
return ____(6)____;
}
int main() {
std::cin >> n;
for (int i = 0; i < n; ++i) std::cin >> a[i];
total = (long long)n * (n + 1) / 2;
int begin = 0;
int end = 1000000001;
while (true) {
int length = ____(7)____;
if (length == 1) break;
auto mid = ____(8)____;
if (predicate(mid))
begin = mid;
else
end = mid;
}
std::cout << ____(9)____ << "\n";
}
```
41.
珅泽教育CSP-J第一轮模拟考第九套 第 41 题
42.
珅泽教育CSP-J第一轮模拟考第九套 第 42 题
43.
珅泽教育CSP-J第一轮模拟考第九套 第 43 题
44.
珅泽教育CSP-J第一轮模拟考第九套 第 44 题
45.
珅泽教育CSP-J第一轮模拟考第九套 第 45 题