0%

NO.38_CCF-CSP

记录一下2025年6月8号下午13:30-17:30奋战CCF-CSP四小时无果后,“第一次考试就280+”的黄粱美梦无情破碎的故事。
多少分就不说了,只能说还是太嫩了。
题目列表

  1. 正态分布
  2. 马走“日”的可能数
  3. 解码
  4. 月票的可能数
  5. 旅行攻略

正态分布

题目描述

已知一个正态分布 \( X \sim N(\mu, \sigma^2) \),以及一个观测值 \( n \),请将其转换为标准正态分布下的 z 值,并判断该 z 值在标准正态分布表中所对应的 行号和列号

  • 行号:取 z 值保留一位小数后的值乘以 10(例如 z = 1.23 ⇒ 行号为 12)
  • 列号:取 z 值保留两位小数后的第二位小数(例如 z = 1.23 ⇒ 列号为 3)

注意:标准正态分布表通常只列出 z ≥ 0 的部分,若 z < 0,应提示不在查表范围内。

输入格式

第一行输入一个整数 \( t \)(表示测试数据组数)
接下来每组测试输入三项:

  • \( \mu \):正态分布的均值(double)
  • \( \sigma \):标准差(double,非零正数)
  • \( n \):观测值(double)

输出格式

对于每组测试,输出对应的行号和列号。

输入样例

1
2
3
2
100 15 124.5
50 5 45.3

输出样例

1
16 3

提示

  • 可使用公式 ( z = \frac{n - \mu}{\sigma} ) 进行标准化;
  • 行号取整数部分 z × 10,列号取 z 保留两位小数后的小数点第二位;
  • 若 z 值近似边界(如 z = 1.23999),建议用四舍五入防止误差。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

int main() {
int t;
cin >> t;

while (t--) {
double mu, sigma, n;
cin >> mu >> sigma >> n;

double z = (n - mu) / sigma;

cout << fixed << setprecision(4);

int row = int(z * 10);
int col = int(z * 100 + 0.5) % 10;
cout << row << " " << col << endl;
}

return 0;
}

注意:总共只有10列

马走“日”的可能数

题目描述

在一个 ( n \times n ) 的国际象棋棋盘上,给定马的初始位置 ( (x, y) ) 和最多可走的步数 ( k )。请计算在不走出棋盘的前提下,马从起始位置最多走 ( k ) 步,可以到达多少个不同的位置(包括起点)。

马的移动方式如下(共 8 种):

  • (±2, ±1)
  • (±1, ±2)

输入格式

第一行输入一个整数 ( t )(表示测试组数)
接下来每组输入四个整数:

  • ( n ):棋盘大小(1 ≤ n ≤ 25)
  • ( x )、( y ):起始位置,坐标从 0 开始(0 ≤ x, y < n)
  • ( k ):最多可以移动的步数(0 ≤ k ≤ 10)

输出格式

每组输出一行,表示最多走 k 步后,马可以到达的不同位置数

输入样例

1
2
3
2
3 0 0 1
8 0 0 2

输出样例

1
2
2
10

解题思路

  1. 使用 BFS 从起点出发,记录当前走了几步;
  2. 只要当前步数 ≤ k,就尝试向 8 个马步方向扩展;
  3. 使用 visited[x][y]unordered_set 记录所有访问过的位置;
  4. 最后统计不同位置的数量即可。

C++ 参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <cstring>
using namespace std;

const int MAXN = 25;
bool vis[MAXN][MAXN]; // 标记访问过的位置
int n, k, count;
int dx[8] = {-2, -2, -1, -1, 1, 1, 2, 2};
int dy[8] = {-1, 1, -2, 2, -2, 2, -1, 1};

void dfs(int x, int y, int step) {
if (x < 0 || x >= n || y < 0 || y >= n || step < 0) return;

if (!vis[x][y]) {
vis[x][y] = true;
count++;
}

if (step == 0) return;

for (int i = 0; i < 8; ++i) {
int nx = x + dx[i];
int ny = y + dy[i];
dfs(nx, ny, step - 1);
}
}

int main() {
int t;
cin >> t;
while (t--) {
int x, y;
cin >> n >> x >> y >> k;

count = 0;
memset(vis, 0, sizeof(vis));

dfs(x, y, k);

cout << count << endl;
}

return 0;
}

解码

题目不记得了,反正超级长,没看懂

月票的可能数

欢迎打赏