全国信息学奥林匹克联赛(NOIP2013)复赛 提高组 day1
CCF NOIP2013
解题报告&心得
虽然已经过去很久了,但是终于有机会有时间写一下解题报告
——By 黄锦松 FJ-0318 泉州五中
NOIP 2013 成绩单 姓名 准考证号 总分 circle match truck block flower puzzle 黄锦松 FJ-0318 225 100 10 0 10 100 5
我拿到了225分,(坑爹地传错了一题,还是最简单的Day2的block,我的100分啊!!!),在我大福建只有三等奖,即使全国省一等奖基准线只有200,今年的分数线变高了,我欣喜中国未来的计算机产业的良好发展势头。我只是其中微不足道的一员,我觉得我是一个奇怪的人,别人都是数学+信息,我是化学+信息。我觉得我大学应该是会去读化学了,信息产业的舞台就留给大家去表演了。
第 1 页共 4 页
全国信息学奥林匹克联赛(NOIP2013)复赛 提高组 day1
切入正题******
CCF 全国信息学奥林匹克联赛(NOIP2013)复赛
提高组 day1
(请选手务必仔细阅读本页内容)
一.题目概况 中文题目名称 转圈游戏 火柴排队 货车运输 英文题目与子目录circ matctru名 可执行文件名 circ matctru输入文件名 circle.in match.in truck.in 输出文件名 circle.out match.out truck.out 每个测试点时限 1 1 1 秒 秒 秒 测试点数目 10 10 20 每个测试点分值 10 10 5 附加样例文件 有 有 有 结果比较方式 全文比较(过滤行末空格及文末回车) 题目类型 传 传传运行内存上限 128M 128M 128M 二.提交源程序文件名 对于 C++语言 circle.cpp match.cpp truck.cpp 对于 C 语言 circle.c match.c truck.c 对于 pascal 语言 circle.pas match.pas truck.pas 三.编译命令(不包含任何优化开关) 对于 C++语言 g++ -o g++ -o match g++ -o circle match.cpp -lm truck 对于 C 语言 gcc-o circle gcc-o match gcc-o truck circle.c match.c – truck.c 对于 pascal 语fpc fpc match.pas fpc truck.pas 言
注意事项:
1、文件名(程序名和输入输出文件名)必须使用英文小写。 2、C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必须是 0。 3、全国统一评测时采用的机器配置为:CPU AMD Athlon(tm) 64x2 Dual Core CPU 5200+,
第 2 页共 4 页
全国信息学奥林匹克联赛(NOIP2013)复赛 提高组 day1
2.71GHz,内存 2G,上述时限以此配置为准。 4、只提供 Linux 格式附加样例文件。 5、特别提醒:评测在 NOI Linux 下进行。
第 3 页共 4 页
全国信息学奥林匹克联赛(NOIP2013)复赛
提高组 day2
1.转圈游戏 (circle.cpp/c/pas)
【问题描述】
n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏。按照顺时针方向给 n 个位置编号,从 0 到 n-1。最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置,……,依此类 推。
游戏规则如下:每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号位置,……,依此类推,第n ? m号位置上的小伙伴走到第 0 号位置,第n-m+1 号位置上的小伙伴走到第 1 号位置,……,第 n-1 号位置上的小伙伴顺时针走到第m-1 号位置。
现在,一共进行了 10k 轮,请问 x 号小伙伴最后走到了第几号位置。
【输入】
输入文件名为 circle.in。
输入共 1 行,包含 4 个整数 n、m、k、x,每两个整数之间用一个空格隔开。
【输出】
输出文件名为 circle.out。 输出共 1 行,包含 1 个整数,表示 10k 轮后 x 号小伙伴所在的位置编号。
【输入输出样例】 circle.in 10 3 4 5
【数据说明】
对于 30%的数据,0 < k < 7; 对于 80%的数据,0 < k < 107;
对于 100%的数据,1 < n< 1,000,000,0 对于转圈游戏(快速幂) 根据题目,答案明显是(x+10^km) mod n,化简一下,就成了(x + m (10^k mod n) mod n) mod n,所以,只需要求出10^k mod n即可,可以使用快速幂来求解,复杂度O(log k)。 本人代码(100分) var n,m,k,x,g,t,r,i:longint; a:array[0..1000000]of longint; begin assign(input,'circle.in'); reset(input); assign(output,'circle.out'); rewrite(output); 第 1 页共 5 页 circle.out 5 全国信息学奥林匹克联赛(NOIP2013)复赛 提高组 day2 readln(n,m,k,x); g:=k; t:=0; while g<>0 do begin inc(t); a[t]:=g mod 2; g:=g div 2; end; r:=1; for i:=t downto 1 do begin k:=(r*r) mod n; if a[i]<>0 then r:=((10*k)mod n)mod n else r:=k; end; for i:=1 to r do x:=(x+m)mod n; writeln(x); close(input); close(output); end. 2.火柴排队 (match.cpp/c/pas) 【问题描述】 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为: ,其中 ai 表示第一列火柴中第 i 个火柴的高度,bi 表示第二列火 柴中第 i 个火柴的高度。 每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最 小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99,999,997 取模的结果。 【输入】 输入文件为 match.in。 共三行,第一行包含一个整数 n,表示每盒中火柴的数目。 第二行有 n 个整数,每两个整数之间用一个空格隔开,表示第一列火柴的高度。 第三行有 n 个整数,每两个整数之间用一个空格隔开,表示第二列火柴的高度。 【输出】 输出文件为 match.out。 输出共一行,包含一个整数,表示最少交换次数对 99,999,997 取模的结果。 第 2 页共 5 页