NOIp2017普及组解题报告与参赛总结
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
29
ans := a[j];
30
if ans = '666666666' then writeln(-1) else writeln(ans);
31 end;
32 close(input);
33 close(output);
34 end.
NOIp2017 普及组解题报告&参赛总结
By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓 7 / 28
算法一(100pts)
因为题目较为简单,所以直接将正解吧。 先读入元素集合和 ������ 个询问,对于每个询问 ������������, ������������,因为已经给定位数,且位 数不多,直接枚举(暴力)求出 ������������������1≤������≤������ ������������ (������������ ������������������ 10������������ = ������������) 即可。 时间复杂度 ������(������������) 空间复杂度 ������(1)
第一题 成绩 (score.cpp/c/pas)
Time Limit: 1sec Memory Limit: 256MB
题意
给定 ������, ������, ������,求 ������ × 20% + ������ × 30% + ������ × 50% 的值。
算法一(60pts)
对于题目中 30% 的数据,可以直接输出 ������ 的值(分数线表示整除以,下同)。
NOIp2017 普及组解题报告&参赛总结 By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓
NOIp2017 普及组
解题报告 & 参赛总结
By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓
NOIp2017 普及组解题报告&参赛总结
By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓 1 / 28
NOIp2017 普及组解题报告&参赛总结 By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓
注意:
1. 笔者水平不高,可能有表达不严谨或疏漏。 2. 笔者初一蒟蒻,代码风格极为丑陋,且比较繁琐,或许有改进的地方。 3. 笔者数学不好,有些公式的表达或许有些问题,请见谅。 4. 限于篇幅原因,有些算法写的比较粗略,请见谅。 5. 有些语言、变量名的变化会在具体题目中说明,请注意。
目录:
标题 „„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„1
算法一(60pts)
深度优先搜索。计算从起点到终点的每条路径需要花费的金币数,比较出最小值。
每个点都有 4 个方向能走,有色直接走,无色用魔法。 用 ������������������(������, ������, ������, ������) 表示当前状态为从 (������, ������) 出发走到 (������, ������),当前点的颜色为 ������, 已经用了 ������ 次魔法。 可以加上最优性剪枝:当前金币数已经大于之前的最小值,则退出(剪枝),可 以多得 5 分。原来只有 55 分。
13 reset(input);
14 assign(output, 'librarian.out');
15 rewrite(output);
16 read(n, q);
17 for i := 1 to n do
18 begin
19
read(x);
20
str(x, a[i]);
21 end;
22 for i := 1 to q do
第四题 跳房子(jump)„„„„„„„„„„„„„„„„„„„„„„„16
参赛总结 „„„„„„„„„„„„„„„„„„„„„„„„„„„„„28
NOIp2017 普及组解题报告&参赛总结
By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓 2 / 28
NOIp2017 普及组解题报告&参赛总结 By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓
题意
给定一个包含 ������ 个元素的集合 *������1, ������2, … , ������������+(区别:元素可以重复)与 ������ 个 询问 ������������, ������������,求集合中以正整数 ���������(��� 以位数为 ������������)为后缀的最小的正整数元素。
6 begin
7 if length(a) < length(b) then exit(true);
8 if length(b) < length(a) then exit(false);
9 exit(a <= b);
10 end;
11 begin
12 assign(input, 'librarian.in');
NOIp2017 普及组解题报告&参赛总结 By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓
代码_算法二(Pascal)
1 var
2 n, q, i, j, m, x : longint;
3 a : array[0..1001] of string;
4 s, ans : string;
5 function minn(a, b : string) : boolean;
12 read(n, q);
13 for i := 1 to n do read(a[i]);
14 for i := 1 to q do
15 begin
16
read(m, x);
17
ans := maxlongint;
18
for j := 1 to n do
19
if (a[j] >= x) and (a[j] mod p[m] = x) and (a[j] < ans) then
时间复杂度 ������(路径数)
空间复杂度 ������(������2)
NOIp2017 普及组解题报告&参赛总结
By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓 8 / 28
NOIp2017 普及组解题报告&参赛总结 By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓
算法二(100pts)
广度优先搜索或记忆化深搜。思路与算法一基本相似,这里我们用数组保存各状 态,用 ������������������������������ 表示从 (1,1) 出发走到 (������, ������),当前点的颜色为 ������,已经用了 ������ 次 魔法的花费金币的最小值。但是这个“广搜”又与普通的广搜不一样,这里的“边 权”不是 1。也就是说,第一次搜到这个点时的金币数量不一定是最优的。那么 我们采用 SPFA 的方法——多次进队列。这样处理就 AC 了。记忆化搜索同理。
10
write(c div 2)
11 else
12
write(c div 2 + 50);
13 close(input);
14 close(output);
15 end.
代码_算法二(Pascal)(推荐此算法)
1 var 2 a, b, c : longint; 3 begin 4 assign(input, 'score.in'); 5 reset(input); 6 assign(output, 'score.out'); 7 rewrite(output); 8 readln(a, b, c); 9 write(trunc(a * 0.2 + b * 0.3 + c * 0.5)); //也可以写:0:0 10 close(input); 11 close(output); 12 end.
23 begin
24
read(m, x);
25
str(x, s);
26
ans := '666666666';
27
for j := 1 to n do
28
if (minn(s, a[j])) and (copy(a[j], length(a[j]) - m + 1, m) = s)
and (minn(a[j], ans)) then
20
ans := a[j];
21
if ans = maxlongint then writeln(-1) else writeln(ans);
22 end;
23 close(input);
百度文库
24 close(output);
25 end.
NOIp2017 普及组解题报告&参赛总结
By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓 6 / 28
5
10 2
时间复杂度 ������(1) 空间复杂度 ������(1)
NOIp2017 普及组解题报告&参赛总结
By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓 3 / 28
NOIp2017 普及组解题报告&参赛总结 By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓
代码_算法一(Pascal)
1 var
NOIp2017 普及组解题报告&参赛总结 By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓
代码_算法一(Pascal)(推荐此算法)
1 var
2 n, q, i, j, m, x, ans : longint;
3 a : array[0..1001] of longint;
4 p : array[0..8] of longint;
5 begin
6 assign(input, 'librarian.in');
7 reset(input);
8 assign(output, 'librarian.out');
9 rewrite(output);
10 p[0] := 1;
11 for i := 1 to 8 do p[i] := p[i - 1] * 10; //p[i]表示 10^i
目录 „„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„2
第一题 成绩(score)„„„„„„„„„„„„„„„„„„„„„„„„3
第二题 图书管理员(librarian)„„„„„„„„„„„„„„„„„„„5
第三题 棋盘(chess)„„„„„„„„„„„„„„„„„„„„„„„„8
(为了方便和习惯,我们把矩阵边长规定为 ������,有颜色点的个数为 ������,与题目 规定的相反,请注意)
每个单位时间只能往上下左右四个方向走一个格子,且要在矩阵中并且格子 中有颜色。
如果走的下一个格子中的颜色与当前位置颜色相同,则不需要金币;否则需 要花费 1 金币。
存在魔法。魔法可以把上下左右的任意无色格子变成有色格子,且颜色自己 定。但是用魔法变的有色格子只能持续一单位时间,而且不能用连续两次魔 法。
2 a, b, c : longint;
3 begin
4 assign(input, 'score.in');
5 reset(input);
6 assign(output, 'score.out');
7 rewrite(output);
8 readln(a, b, c);
9 if a = 0 then
算法二(100pts)
还是先读入。接下来对于每个询问可以把 ������������ 转化为字符串,然后枚举(暴力) 查找匹配,找出符合条件的最小值。 时间复杂度 ������(������������) 空间复杂度 ������(1)
NOIp2017 普及组解题报告&参赛总结
By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓 5 / 28
2
对于题目中另外 30% 的数据,可以直接输出 50 + ������ 的值。
2
时间复杂度 ������(1) 空间复杂度 ������(1)
算法二(100pts)
正解。读入后直接输出 0.2������ + 0.3������ + 0.5������ 即可,C++选手需要注意精度问题。
也可以写 ������ + 3 · ������ + ������ 的值。
NOIp2017 普及组解题报告&参赛总结 By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓
第三题 棋盘
(chess.cpp/c/pas)
Time Limit: 1sec Memory Limit: 256MB
题意
给定一个只有两种颜色的 ������ × ������ 的矩阵,有 ������ 个格子有颜色,颜色已给定。 请你求出遵守以下规则从矩阵左上角 (1,1) 到达右下角 (������, ������) 的最少需要花的 金币。
NOIp2017 普及组解题报告&参赛总结
By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓 4 / 28
NOIp2017 普及组解题报告&参赛总结 By 浙江省诸暨市浣江教育集团浣江初中 孟煜皓
第二题 图书管理员
(librarian.cpp/c/pas)
Time Limit: 1sec Memory Limit: 256MB