720 likes | 1.01k Views
2011 年湖南省大学生计算机程序设计竞赛 教练培训会. 刘汝佳 rujia.liu@gmail.com. 目录. ACM/ICPC 竞赛发展概述 ACM/ICPC 竞赛试题命题原则及基本要求 ACM/ICPC 评测系统 典型试题解析(含 2010 省赛部分题目) 参赛选手的选拔与训练. 目录. ACM/ICPC 竞赛发展概述 ACM/ICPC 竞赛试题命题原则及基本要求 ACM/ICPC 评测系统 典型试题解析(含 2010 省赛部分题目) 参赛选手的选拔与训练. ACM/ICPC 系列比赛. 总决赛 区域赛 亚洲 欧洲 北美洲 其他赛区.
E N D
2011年湖南省大学生计算机程序设计竞赛教练培训会2011年湖南省大学生计算机程序设计竞赛教练培训会 刘汝佳 rujia.liu@gmail.com
目录 • ACM/ICPC竞赛发展概述 • ACM/ICPC竞赛试题命题原则及基本要求 • ACM/ICPC评测系统 • 典型试题解析(含2010省赛部分题目) • 参赛选手的选拔与训练
目录 • ACM/ICPC竞赛发展概述 • ACM/ICPC竞赛试题命题原则及基本要求 • ACM/ICPC评测系统 • 典型试题解析(含2010省赛部分题目) • 参赛选手的选拔与训练
ACM/ICPC系列比赛 • 总决赛 • 区域赛 • 亚洲 • 欧洲 • 北美洲 • 其他赛区
ACM/ICPC近十年发展 • 参赛规模 • 题目难度 • 算法性 • 代码量 • 知识面 • 相关比赛 • 各OJ的网上比赛 • TopCoder /GCJ/百度之星/有道难题 • 业界对ACM/ICPC选手的态度
目录 • ACM/ICPC竞赛发展概述 • ACM/ICPC竞赛试题命题原则及基本要求 • ACM/ICPC评测系统 • 典型试题解析(含2010省赛部分题目) • 参赛选手的选拔与训练
单题命题原则 • 题目清晰无歧义 • 名词解释 • 约束(输入范围、格式、输出范围) • 多解、无解的处理方式 • 可做性 • 答案客观、可评判 • 存在正确算法,使得对于满足题目约束下的绝大多数输入数据均能出解 • 代码长度合理(极难题除外) • 避免论文题和知识点很偏的题
题目搭配原则 • 一般为8-11题,编号为A~K • 有一定比例的简单题、中档题和难题,以控制比赛结果 • 不同赛区的整体难度系数不同 • 思维难度 • 编程难度(包括调试难度) • 严密性要求(特殊情况等) • 部分题目在题意理解上也有难度 • 避免知识点扎堆,鼓励多样性
考查重点 • 语言熟练程度:输入输出技巧、字符串处理、库函数、复杂代码的组织 • 算法与数据结构 • 数学概念与方法(数论、初等代数、线性代数、组合计数等) • 数学建模(包括对经典模型的掌握程度) • 后面会对知识点、训练方法进行详细叙述
目录 • ACM/ICPC竞赛发展概述 • ACM/ICPC竞赛试题命题原则及基本要求 • ACM/ICPC评测系统 • 典型试题解析(含2010省赛部分题目) • 参赛选手的选拔与训练
排名和评奖方法 • 做题数 • 罚时 • 单题奖(*)
评测基础 • 名词解释:AC, WA, TLE • 其他反馈:PE, RTE, OLE, CE • 关于special judge • 每题只要完美解答才有意义! • 测试数据对题目的巨大影响 • 正确性 • 全面程度(规模、分类情况) • 合理性(浮点误差、输入数据量等)
关于评测系统 • 手工评测和自动评测 • PC^2 • DOMJudge • OJ • 关于rejudge • 如何请求clar • 谈谈几次regional裁判经历 • Beijing2002/2007, Xi’an2006, KL2008 • 反馈歧义、裁判一致性、代码随机性
初学者的陷阱 • 标准I/O,文件输入,重定向 • exit code • 画蛇添足的输入提示和异常处理 • 不注意输入规模 • 边界/特殊数据 • 评测数据一般比样例难得多! • 不能使用fork、线程创建、网络相关函数 • 建议避免无用的工程性代码
目录 • ACM/ICPC竞赛发展概述 • ACM/ICPC竞赛试题命题原则及基本要求 • ACM/ICPC评测系统 • 典型试题解析(含2010省赛部分题目) • 参赛选手的选拔与训练
电灯问题 • 按最少的开关把开始状态改变为终止状态
包装导管 • 你的任务是用一个尽量小的圆包含四个大小给定的圆。
找图形 • 在n条线段的大图里找一个m条线段的小图。线段都是水平/竖直的,小图中至少有一个线段端点对应大图的线段端点。大图的比例尺比小图要小。n,m<=50
地雷 • 平面上有n(<=2000)个地雷。每颗地雷的爆炸范围是以它为中心的正方形。当炸弹爆炸时,爆炸范围内部和边界上的其他炸弹也将被引爆,形成链式效应。如下图,引爆地雷1、地雷2和地雷5,将使所有地雷爆炸。
猜序列 • 对于一个序列a1, a2, ..., an,我们可以计算出一个符号矩阵S,其中Sij为ai+…+aj的符号(连加和大于0则Sij=‘+’,连加和小于0则Sij=‘-’,否则为’0’)。 • 给一个符号矩阵,找出一个对应的序列。输入保证存在一个每个整数的绝对值不超过10的序列满足条件。 • n<=10
运送超级计算机 • 宇宙中有n个星球,你的任务是用最短的时间把k个超级计算机从星球S运送到星球T。每个超级计算机需要一整艘飞船来运输。行星之间有m条双向隧道,每条隧道需要一天时间来通过,且不能有两艘飞船同时使用同一条隧道。隧道不会连接两个相同的行星,且每一对行星之间最多只有一条隧道。
拿行李 • 飞机到达之后,你需要在行李提取处拿行李。行李会在一个多边形传送带上匀速运动,你的初始位置在多边形外部,并且当行李一出现就立刻开始匀速行走(速度严格大于行李运动的速度),直到拿到行李。你的任务是求出拿到行李的最短时间。
不同的数字 • 给定一个正整数n,求一个由最少不同数字组成的正整数m且m为n的倍数。如果有多个m,组成它们的不同数字个数相等,则取最小的一个。数据范围:1<=n<65536。注:所有数字皆为十进制。
音乐厅调度 • 一个著名的音乐厅因为财务状况恶化快要破产,你临危受命,试图通过管理的手段来拯救它,方法之一就是优化演出安排,即聪明的决定接受和拒绝哪些乐团的演出申请,使得音乐厅的收益最大化。该音乐厅有两个完全相同的房间,因此各乐团在申请演出的时候并不会指定房间,你只需要随便分配一个即可。每个演出都会持续若干天,每个房间每天只能举行一场演出。
王国 • 平面上有n个城市,初始时城市之间没有任何双向道路相连。你的任务是一次执行以下指令: • road A B:给城市A和城市B连一条双向道路。这条道路保证不和其他道路在非端点处相交。 • line C:询问一条y=C的水平线和多少个州相交,以及这些州一共包含多少座城市。在任意时刻,每一组连通的城市形成一个州。在本指令中,C的小数部分保证为0.5。 • n<=100,000个城市,m<=200,000条指令
例如,在下图中,y=4.5穿过两个州,共8个城市;y=6.5穿过一个州,共5个城市。例如,在下图中,y=4.5穿过两个州,共8个城市;y=6.5穿过一个州,共5个城市。
立方体成像 • 有一个n*n*n立方体,其中一些单位立方体已经缺失(剩下部分不一定连通)。每个单位立方体重量为1克,且被涂上单一的颜色(即六个面的颜色相同)。给出前、左、后、右、顶、底六个视图,你的任务是判断这个物体最多有多重。
派 • 有F+1个人来分N个圆形派,每个人得到的必须是一整块派(而不是好几块拼在一起),且面积要相同。问每个人最多能得到多大面积的派(不必是圆形)。
长城守卫 • 有n个人围成一个圈,其中第i个人想要ri个不同的礼物。相邻的两个人可以聊天,炫耀自己的礼物,所以如果他们发现自己拥有的某个礼物别人也有,会很不高兴。问:一共需要多少种东西才能满足所有人的需要?假设每种东西有无穷多个,不相邻的两个人不会一起聊天,所以即使拿到相同的礼物也没关系。 • 一共有5个人,每个人都要一个礼物,则至少要3种礼物:1,2,1,2,3;如果每个人要两个礼物,则至少要5种礼物: {1,2},{3,4},{1,5},{2,3},{4,5}。
分享巧克力 • 给出一个长为x,宽为y的矩形巧克力,每次操作可以对其沿一条直线进行切割成两块长宽均为整数的巧克力。问:是否可以经过若干次操作将其切成n块面积为a1,a2,...,an的巧克力?如下图,可以把3*4的巧克力切成面积分别为6, 3, 2, 1的四块。 • n<=15, x,y<=100
正方形 • 给定平面上n个边平行于坐标轴的矩形,在它们的顶点中找出两个欧几里得距离最大的点。如下图,距离最大的是S1的左下角和S8的右上角。正方形可以重合或者交叉。
丛林警戒队 • 在丛林中有n(<=50000)个瞭望台,形成一个凸n多边形。这些瞭望台的保护范围就是这个凸多边形内的任意点。敌人进攻时,会炸毁一些瞭望台,使得总部暴露在那些剩下瞭望台的凸包之外。平面上任选一个点作为总部,使得敌人需要炸坏的瞭望台数量尽量多。
2010省赛情况 A 197/0/129 B 222/4/123 C 182/3/115 D 240/37/32 E 305/31/33 F 165/154/9 G 96/76/15 H 34/75/15 I 28/126/6 J 0/--/0 K 18/--/0 提交数/最快Yes/总Yes 注意对“通过率”的解释:上手容易程度、陷阱
A.汽水瓶 • 有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
#include<stdio.h> int main() { int n; while(scanf("%d", &n) == 1) { if(!n) break; printf("%d\n", n/2); } return 0; }
B. 弟弟的作业 • 你的弟弟刚做完了“100以内数的加减法”这部分的作业,请你帮他检查一下。每道题目(包括弟弟的答案)的格式为a+b=c或者a-b=c,其中a和b是作业中给出的,均为不超过100的非负整数;c是弟弟算出的答案,可能是不超过200的非负整数,也可能是单个字符"?",表示他不会算。
#include<stdio.h> int main() { char s[99]; int a, b, c, n = 0; while(scanf("%s", &s) == 1) { if(sscanf(s, "%d+%d=%d", &a, &b, &c) == 3 && a+b==c) n++; if(sscanf(s, "%d-%d=%d", &a, &b, &c) == 3 && a-b==c) n++; } printf("%d\n", n); return 0; }
C. 数字整除 • 定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数 。 • 例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,因为20-5=15不是17的倍数。输入一个正整数n,你的任务是判断它是否是17的倍数。 • 1<=n<=10100
#include<stdio.h> #include<string.h> int main() { char s[200]; while(scanf("%s", &s) == 1) { if(!strcmp(s, "0")) break; int m = 0; for(int i = 0; i < strlen(s); i++) m = (m*10+s[i]-'0')%17; printf("%d\n", m==0?1:0); } return 0; }
D. 台球碰撞 • 在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形。有一个球心在(x,y),半径为R的圆形母球放在台球桌上(整个球都在台球桌内)。受撞击后,球沿极角为a的射线(即:x正半轴逆时针旋转到此射线的角度为a)飞出,每次碰到球桌时均发生完全弹性碰撞(球的速率不变,反射角等于入射角)。
如果球的速率为v,s个时间单位之后球心在什么地方?如果球的速率为v,s个时间单位之后球心在什么地方? • 每个数据包含8个正整数L,W,x,y,R,a,v,s • 100<=L,W<=105, 1<=R<=5 • R<=x<=L-R, R<=y<=W-R, 0<=a<360, • 1<=v,s<=105
#include<stdio.h> #include<math.h> int main() { double L, W, x, y, R, a, v, s; while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &L, &W, &x, &y, &R, &a, &v, &s) == 8) { if(!L) break; x -= R; y -= R; L -= R*2; W -= R*2; a *= acos(0.0)/90.0; double dx = fmod(fmod(v*s*cos(a), L*2)+L*2, L*2); double dy = fmod(fmod(v*s*sin(a), W*2)+W*2, W*2); if(x+dx <= L) x += dx; else if(x+dx <= L*2) x = L-(x+dx-L); else x = x+dx-L*2; if(y+dy <= W) y += dy; else if(y+dy <= W*2) y = W-(y+dy-W); else y = y+dy-W*2; printf("%.2lf %.2lf\n", x+R, y+R); } return 0; }
E. 内部收益率 • 在金融中,我们有时会用内部收益率IRR来评价项目的投资财务效益,它等于使得投资净现值NPV等于0的贴现率。换句话说,给定项目的期数T、初始现金流CF0和项目各期的现金流CF1, CF2, ...,CFT,IRR是下面方程的解:
为了简单起见,本题假定:除了项目启动时有一笔投入(即初始现金流CF0 < 0)之外,其余各期均能赚钱(即对于所有i=1,2,...,T,CFi> 0)。根据定义,IRR可以是负数,但不能必须大于-1。 • 每个数据占两行,第一行包含一个正整数T(1<=T<=10),表示项目的期数。第二行包含T+1个整数:CF0, CF1, CF2, ..., CFT,其中CF0 < 0, 0 < CFi< 10000 (i=1,2,...,T) • 输出仅一行,即项目的IRR,四舍五入保留小数点后两位。如果IRR不存在,输出"No",如果有多个不同IRR满足条件,输出"Too many"(均不含引号)
#include<stdio.h> int main() { int n, cf[20]; while(scanf("%d", &n) == 1) { if(!n) break; for(int i = 0; i <= n; i++) scanf("%d", &cf[i]); double l = -1.0, r = 1e6, m; for(int i = 0; i < 100; i++) { m = l + (r-l)/2; double f = 1.0, s = 0; for(int j = 1; j <= n; j++) {f /= (1+m); s += cf[j]*f;} if(s < -cf[0]) r = m; else l = m; } printf("%.2lf\n", m); } return 0; }
F. 最大的数 • 在有障碍的网格中走出一个最大的数。每个格子最多经过一次,每次只能往上、下、左、右四个方向之一走一格。 • 2<=R,C<=15, RC<=30
G. 修路 • 有一个C个结点R条边的有权无向图,求结点1到结点C的最短时间。从结点1出发的瞬间,你可以最多派人修一条路。对于路i来说,如果修了t个单位的时间,修完之后经过此路需要viai-t单位时间。换句话说,如果不修,需要vi单位时间经过。路没有修完之前不能通过。 • 2<=C<=100, 1<=R<=500, 1<=vi<=20, 1<=ai<=5