- 1、本文档共61页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[小学作文]顾昱洲题目分析
IOI2012
南京师范大学附属中学 顾昱洲
题目形式
提交答案题:odometer
交互题:supper
这里的“交互题”指IOI从2010年起出现的一个题型,即写两个程序,第一个程序处理读入的数据,第一个程序的输出(有各种限制)交给第二个程序处理,并由第二个程序输出需要的结果
交互性质的传统题
形式上为传统意义的交互题
但是实质为传统题
交互性质使得大部分题目都必须在线
捆绑测试
每个Subtask必须通过所有测试点才能得分
几乎杜绝骗分可能
D1P1 odometer
Leonardo的卵石里程表
2名选手获得满分
非常规的提交答案题
(非常规的传统题:WC 2008 超能纸带机)
odometer
为一个256*256的棋盘上的一个机器人编程完成给定的任务
每个格子包括最多15颗石子 (重要条件!)
坐标范围0..255
机器人占据一个格子,初始时在(0, 0),面朝北
基本命令
left – 左转 (不改变位置)
right – 右转 (同上)
move – 前进 (若前方为边界,则命令无效)
get – 从当前格子中去掉一颗石子 (若格中无石子,则命令无效)
put – 向当前格子加入一颗石子 (若格中有15颗石子,则无效)
halt – 结束程序
流程控制命令
用L表示任何合法的标号
jump L – 无条件跳至L处
border L – 若前方为边界,则跳至L处
pebble L – 若当前格子有石子,则跳至L处
L: – 声明标号L;并非命令
评分依据
程序长度(PS) – 去除注释、空行、标号声明后的总行数
运行长度(EL) – 程序运行至结束总共处理的命令的次数
Subtask 1
在(0, 0)及(0, 1)各有X个和Y个石子,其余格子没有石子。若X≤Y,程序结束时应停留在(0, 0),否则应停留在(0, 1)。
PS≤100,EL≤1000
思路
依次取石子,直到某个格子为空
例子
5
2
4
1
0
3
Subtask 2
在(0, 0)及(0, 1)各有X个和Y个石子,其余格子没有石子。若X≤Y,程序结束时应停留在(0, 0),否则应停留在(0, 1)。此时(0, 0)和(0, 1)中石子数应与初始时相同。
PS≤200,EL≤2000
思路
与Subtask 1类似
不同之处:
在(0, 0)中取石子后,放入(1, 0)
在(0, 1)中取石子后,放入(1, 1)
得到最终应停留的位置后,在(0, 2)中记录
将(1, 0)和(1, 1)中的石子放回原位
Subtask 3
初始时在(0, x)和(0, y) (x≠y且x+y为偶数)各有一颗石子。结束时应停留在(0, (x+y)/2)。
PS≤200,EL≤200000
思路
开始
找到第一个石子,将其右移一格
找到第二个石子,将其左移一格
若该格中有两个石子,跳至结束
跳至开始
结束
例子
1
1
1
1
1
2
Subtask 4
网格中总共有不超过15颗石子,将它们全部移动到(0, 0)
PS≤200,EL≤200000
有部分分,EL≤2000000时,能得到32-32lg(EL/200000)分。
基本思路
对每行处理,将所有石子移到行首,然后对第一列重复该过程
开始
当前在行首
从前往后遍历该行
若有石子则将其移到行首,回到开始
结束时在行尾,回到行首,进入下一行
遍历顺序
常数优化
瓶颈在于遍历棋盘
移动石子时,原先的程序:
开始
判断是否边界,若是,则跳至结束
向前一格
跳至开始
结束
常数优化
优化后的程序:
开始
判断是否边界,若是,则跳至结束
向前十六格 (十六行)
跳至开始
结束
减少判断是否边界的次数,所有简单循环均可以进行类似的优化
Baby-Step Giant-Step
常数优化
“结束时在行尾,回到行首,进入下一行”
使用更短的遍历:每次处理两行
第一行每次从行首开始找石子,移到行首
第二行每次从行尾开始找石子,移到行首
这样,大部分格子我们只进行了一次判断是否有石子和一次移动
新的遍历顺序
Subtask 5
找到任意一个拥有石子数最少的格子。程序结束时停留在那个格子,且保持每个格子中石子数与初始时相同。
PS≤444,EL有部分分,PS≤444时,能得到28-28lg(PS/444)分。
思路
EL很大,基本可以无视,只需关注PS
回想子任务一,每次遍历棋盘取石子并判断
必须使用计数器记录当前取走了多少石子
但是这里,每个格子都可能为答案位置,不可能采用某个格子作为计数器
重要条件:每个格子内石子数不会超过15
枚举最小值
枚举最小值
(因为很重要所以说两遍)
思路
从0到14枚举答案x,每一次:
遍历棋盘
在该格去除x个棋子
若为空,跳至结束_x
否则加入x个棋子
实现细节
若最小值为
文档评论(0)