开始整卷作答
按大题分页,翻页自动存草稿,做完统一交卷。
## 一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)
第 1–15 题 · 共 15 题
## 二、阅读程序(判断题正确填T,错误填F;判断题1分,选择题3分,共计40分)
### 第1题
```cpp
int solve1(int n)
{
n++;
int size = 0;
int digit[16];
int pow = 1;
int s = 0;
while (n > 0) {
digit[size] = n % 10;
size++;
n /= 10;
s += pow;
pow *= 5;
}
while (size > 0) {
--size;
pow /= 5;
s += (digit[size] / 2) * pow;
if (digit[size] % 2 == 0) break;
}
return s - 1;
}
int solve2(int n)
{
int s = 0;
for(int i = 1; i <= n ; i += 2)
{
int t = i;
bool pass = true;
while (t > 0) {
int x = t % 10;
if(x%2 == 0)
{
pass = false;
break;
}
t /= 10;
}
if (pass) s++;
}
return s;
}
```
保证 `solve1` 与 `solve2` 的参数 `n` 是非负整数。
第 16–22 题 · 共 7 题
### 第2题
```cpp
int a[maxn];
int b[maxn];
int n, m;
const long long mod = 1'000'000'007;
bool filled[maxn][maxn];
long long mem[maxn][maxn];
long long solve(int i, int j)
{
if (i == n) return 1;
if (j == m) return 1;
if (filled[i][j])
return mem[i][j];
filled[i][j] = true;
long long sum = solve(i+1, j) + solve(i, j+1);
if (a[i] == b[j]) {
return mem[i][j] = sum % mod;
}
else {
return mem[i][j] = (sum - solve(i+1, j+1)) % mod;
}
}
int main()
{
std::cin >> n >> m;
for (int i = 0; i < n; ++i) std::cin >> a[i];
for (int i = 0; i < m; ++i) std::cin >> b[i];
std::cout << (solve(0, 0) + mod) % mod << "\n";
}
```
第 23–29 题 · 共 7 题
### 第3题
```cpp
long long k;
int n;
int p[20];
bool used[20] = {false};
long long frac[20];
void gen(int i)
{
if (i > n)
{
for (int i = 1; i <= n; ++i) std::cout << p[i] << " ";
return;
}
for (int a = 1; a <= n; ++a)
if (not used[a]) {
if (k <= frac[n-i]) {
p[i] = a;
used[a] = true;
gen(i+1);
return;
}
else {
k -= frac[n-i];
}
}
}
int main()
{
n = 1;
frac[0] = frac[1] = 1;
std::cin >> k;
while (k > frac[n]) {
k -= frac[n];
frac[n+1] = frac[n] * (n+1);
n++;
}
gen(1);
}
```
第 30–35 题 · 共 6 题
## 三、完善程序(单选题,每小题3分,共计30分)
### 第1题
有一个用户,在连续的 $n$ 天里,都会收到积分,也会消费积分。积分在获得后的 $m$ 天内有效($m$ 为一个给定的整数),过期失效。
在第 $i$ 天,用户将会获得 $p_i$ 分,他需要消费 $c_i$ 分。若积分不足,则用掉全部积分后用其他方式消费。消费积分时,先用最早的。当天获取的积分可以当天消费。请计算这个用户一共消费了多少积分。
```cpp
const int max_size = 100000;
int queue[max_size];
int head = 0;
int tail = 0;
int main()
{
int n, m;
std::cin >> n >> m;
int sum = 0;
for (int i = 0; i < n; ++i) {
int p, c;
std::cin >> p >> c;
queue[____(1)____] = p;
while ( ____(2)____ ) {
if ( ____(3)____ ) {
queue[head] -= c;
sum += c;
c = 0;
}
else {
int amount = ____(4)____;
c -= amount;
sum += amount;
}
}
if ( ____(5)____ > m) {
head++;
}
}
std::cout << sum << "\n";
}
```
第 36–40 题 · 共 5 题
### 第2题
给定一个 $1$ 到 $n$ 的排列 $p_1,p_2,\ldots,p_n$,请统计排列中所有长度大于等于 $2$ 的连续子序列的次大数之和。
定义 $\max_2(a_i,a_{i+1},\ldots,a_j)$ 表示从 $a_i$ 开始到 $a_j$ 结束的连续子序列中,排名第二大的数,这个数就是一个连续子序列的次大数之和。
题目就是要求:
$$
\sum_{1 \le i < j \le n} \max_2(a_i,a_{i+1},\ldots,a_j)
$$
`solve` 用于解决这个问题。
```cpp
int q[maxn];
int prev[maxn];
int next[maxn];
long long solve(int n, int p[])
{
for (int i = 1; i <= n; ++i)
{
____(1)____ ;
}
p[0] = q[0] = prev[0] = 0;
p[n+1] = q[n+1] = next[n+1] = n+1;
for (int i = 1; i <= n; ++i)
{
int num = ____(2)____;
int prev_num = p[i-1];
int next_num = p[i+1];
prev[num] = ____(3)____;
next[num] = ____(4)____;
}
long long sum = 0;
for (int num = 1; num <= n; ++num) {
int prev_num = prev[num];
int prev_prev_num = prev[prev_num];
int next_num = next[num];
int next_next_num = next[next_num];
sum += (long long) num * ____(5)____ * (q[next_num] - q[num]);
sum += (long long) num * (q[num] - q[prev_num]) * ____(6)____ ;
____(7)____ = prev_num;
____(8)____ = next_num;
}
return sum;
}
```
第 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 题
## 二、阅读程序(判断题正确填T,错误填F;判断题1分,选择题3分,共计40分)
### 第1题
```cpp
int solve1(int n)
{
n++;
int size = 0;
int digit[16];
int pow = 1;
int s = 0;
while (n > 0) {
digit[size] = n % 10;
size++;
n /= 10;
s += pow;
pow *= 5;
}
while (size > 0) {
--size;
pow /= 5;
s += (digit[size] / 2) * pow;
if (digit[size] % 2 == 0) break;
}
return s - 1;
}
int solve2(int n)
{
int s = 0;
for(int i = 1; i <= n ; i += 2)
{
int t = i;
bool pass = true;
while (t > 0) {
int x = t % 10;
if(x%2 == 0)
{
pass = false;
break;
}
t /= 10;
}
if (pass) s++;
}
return s;
}
```
保证 `solve1` 与 `solve2` 的参数 `n` 是非负整数。
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
int a[maxn];
int b[maxn];
int n, m;
const long long mod = 1'000'000'007;
bool filled[maxn][maxn];
long long mem[maxn][maxn];
long long solve(int i, int j)
{
if (i == n) return 1;
if (j == m) return 1;
if (filled[i][j])
return mem[i][j];
filled[i][j] = true;
long long sum = solve(i+1, j) + solve(i, j+1);
if (a[i] == b[j]) {
return mem[i][j] = sum % mod;
}
else {
return mem[i][j] = (sum - solve(i+1, j+1)) % mod;
}
}
int main()
{
std::cin >> n >> m;
for (int i = 0; i < n; ++i) std::cin >> a[i];
for (int i = 0; i < m; ++i) std::cin >> b[i];
std::cout << (solve(0, 0) + mod) % mod << "\n";
}
```
23.
珅泽教育CSP-J第一轮模拟考第七套 第 23 题
24.
珅泽教育CSP-J第一轮模拟考第七套 第 24 题
25.
珅泽教育CSP-J第一轮模拟考第七套 第 25 题
26.
珅泽教育CSP-J第一轮模拟考第七套 第 26 题
27.
珅泽教育CSP-J第一轮模拟考第七套 第 27 题
28.
珅泽教育CSP-J第一轮模拟考第七套 第 28 题
29.
珅泽教育CSP-J第一轮模拟考第七套 第 29 题
### 第3题
```cpp
long long k;
int n;
int p[20];
bool used[20] = {false};
long long frac[20];
void gen(int i)
{
if (i > n)
{
for (int i = 1; i <= n; ++i) std::cout << p[i] << " ";
return;
}
for (int a = 1; a <= n; ++a)
if (not used[a]) {
if (k <= frac[n-i]) {
p[i] = a;
used[a] = true;
gen(i+1);
return;
}
else {
k -= frac[n-i];
}
}
}
int main()
{
n = 1;
frac[0] = frac[1] = 1;
std::cin >> k;
while (k > frac[n]) {
k -= frac[n];
frac[n+1] = frac[n] * (n+1);
n++;
}
gen(1);
}
```
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题
有一个用户,在连续的 $n$ 天里,都会收到积分,也会消费积分。积分在获得后的 $m$ 天内有效($m$ 为一个给定的整数),过期失效。
在第 $i$ 天,用户将会获得 $p_i$ 分,他需要消费 $c_i$ 分。若积分不足,则用掉全部积分后用其他方式消费。消费积分时,先用最早的。当天获取的积分可以当天消费。请计算这个用户一共消费了多少积分。
```cpp
const int max_size = 100000;
int queue[max_size];
int head = 0;
int tail = 0;
int main()
{
int n, m;
std::cin >> n >> m;
int sum = 0;
for (int i = 0; i < n; ++i) {
int p, c;
std::cin >> p >> c;
queue[____(1)____] = p;
while ( ____(2)____ ) {
if ( ____(3)____ ) {
queue[head] -= c;
sum += c;
c = 0;
}
else {
int amount = ____(4)____;
c -= amount;
sum += amount;
}
}
if ( ____(5)____ > m) {
head++;
}
}
std::cout << sum << "\n";
}
```
36.
珅泽教育CSP-J第一轮模拟考第七套 第 36 题
37.
珅泽教育CSP-J第一轮模拟考第七套 第 37 题
38.
珅泽教育CSP-J第一轮模拟考第七套 第 38 题
39.
珅泽教育CSP-J第一轮模拟考第七套 第 39 题
40.
珅泽教育CSP-J第一轮模拟考第七套 第 40 题
### 第2题
给定一个 $1$ 到 $n$ 的排列 $p_1,p_2,\ldots,p_n$,请统计排列中所有长度大于等于 $2$ 的连续子序列的次大数之和。
定义 $\max_2(a_i,a_{i+1},\ldots,a_j)$ 表示从 $a_i$ 开始到 $a_j$ 结束的连续子序列中,排名第二大的数,这个数就是一个连续子序列的次大数之和。
题目就是要求:
$$
\sum_{1 \le i < j \le n} \max_2(a_i,a_{i+1},\ldots,a_j)
$$
`solve` 用于解决这个问题。
```cpp
int q[maxn];
int prev[maxn];
int next[maxn];
long long solve(int n, int p[])
{
for (int i = 1; i <= n; ++i)
{
____(1)____ ;
}
p[0] = q[0] = prev[0] = 0;
p[n+1] = q[n+1] = next[n+1] = n+1;
for (int i = 1; i <= n; ++i)
{
int num = ____(2)____;
int prev_num = p[i-1];
int next_num = p[i+1];
prev[num] = ____(3)____;
next[num] = ____(4)____;
}
long long sum = 0;
for (int num = 1; num <= n; ++num) {
int prev_num = prev[num];
int prev_prev_num = prev[prev_num];
int next_num = next[num];
int next_next_num = next[next_num];
sum += (long long) num * ____(5)____ * (q[next_num] - q[num]);
sum += (long long) num * (q[num] - q[prev_num]) * ____(6)____ ;
____(7)____ = prev_num;
____(8)____ = next_num;
}
return sum;
}
```
41.
珅泽教育CSP-J第一轮模拟考第七套 第 41 题
42.
珅泽教育CSP-J第一轮模拟考第七套 第 42 题
43.
珅泽教育CSP-J第一轮模拟考第七套 第 43 题
44.
珅泽教育CSP-J第一轮模拟考第七套 第 44 题
45.
珅泽教育CSP-J第一轮模拟考第七套 第 45 题