It’ s really anice day!
在同一天 早上做一场 晚上做CH 感觉这个人都萌!哒!哒!
好了不牢骚了 先上传送门
http://www.contesthunter.org/contest/CH%20Round%20%2348%20-%20Streaming%20%233%20(NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9BDay1)
资料包 http://pan.baidu.com/s/1gdADrnd
T1: 数三角形
什么叫三角形?这个应该是每个人都知道的。在本题中,我们不允许三角形出现退化的情况,即每条边的长度与每个角的大小也应大于0。
现在平面上有n个两两不重合的点,第i个点的坐标为(x[i],y[i])。你需要计算,以它们作为顶点,一共能构成的三角形的个数。注意,即使是两个全等的三角形,只要它们的位置是不同的,就认为是不同的三角形,详见样例。
对于20%的数据,n=3。
另有30%的数据,保证任意三个点不在同一直线上。
对于100%的数据,n≤100,保证任意两个点不重合,坐标不会超过10,000。
这题就是除去3点共线 其他点能组成的三角形的总数。
由于N <= 100 这题就是送分题了 暴力枚举三个点就好了N*N*N就过了
作为一个有节操的OIer 我们需要深入思考【其实是题解让我深入思考的】
N <= 100 可以用N^3 的方法
那N <= 1000呢?事实证明 这个也是可以做的。
以每个点为原点做一次极角排序 判断极角序就好
注意一下的是 用叉积的同学一定要把下方的点根据原点取反 不然会判断错误
对于用ATAN2的不怕误差的同学 直接判断度数差就好了。
这题在上手的时候我还觉得不可思议:这么简单?N<=100?我仔细读了6、7遍题目,没发现什么坑,模拟一下也对,就直接上了。
事实证明 谨慎还是有用的。枚举三个点的时候也有人因为精度误差被卡了,还好,我用的是叉积。
T2:4和7
萌萌哒doge突然想吃药了!
现在有一排格子,从左向右标号为0到m。doge最初在0号格子中。
一共有n堆药,第i堆药有a[i]粒,被放在b[i]格子里。
每次,萌萌哒doge可以跳到它右边4格或右边7格的位置。求它最多能吃到的药的个数。注意,doge不必跳到格子m,而是可以随时结束游戏。
对于20%的数据,n=1,m≤100,000。
对于40%的数据,n≤15,m≤100,000。
对于60%的数据,m≤100,000。
对于100%的数据,n≤100,000,m≤1,000,000,000,a[i]≤10,000,1≤b[i]≤m。
这就是一题比较有意思的题目了。
一看这种题目模型:DP 以每一个格子作为一个状态
F[I] = max(F[I - 4], F[I - 7]) + A[I].
仔细一看M的范围 10^9 ,让不让人活?
思考半天无果之后 为了T3的编程时间 我决定拿部分分【60分 M <= 10W】
实际上 这一题没有这么难我的方法是:
观察4和7能组成的整数 4 7 8 11 12 15 16 18 19 20 21 22 23 24……
观察得出:一个大于17的整数必定能被4 7组成【Why? 因为已经出现连续的一段了呀vvv】
接下来 我们可以把N个点中两两之间的距离缩短
1、 对于DIS > 18的 DIS = 18
2、 对于DIS < 18的 DIS = DIS。
这样一来 格子数M最多也就是18N 也就是180W ,这个 O(M)还是相当理想的。
其实我当时应该更深入地探究4和7的规律 而不是花时间去打我不擅长的编程复杂度较高的T3 ,失策失策。
T3 :反射镜
注:坐标平面没有边缘,光线不会因为碰到边界而中途停下,m的意义是所有镜子坐标绝对值的最大值不会超过m。
从前有一个坐标网格(其中坐标的绝对值不会超过m)。从左到右x坐标逐渐增加,而从下到上y坐标逐渐增加。
在网格中摆放着n面镜子,第i面镜子的坐标为(x[i],y[i])。镜子均与坐标轴成45°角。所以共有两种类型的镜子:“\”型和“/”型。特殊地,原点处不会有任何镜子,也不会有某个位置有多面镜子。
镜子的两个面都能够反射光线,而中间不透光,例如,对于一个“/”型镜子,从下面射入的光线会被反射到右方向,而从左面射入的光线会被反射到上方向。
现有一条光线从原点所在格子沿x轴正方向射出,求它走过$T$格路程后所在的位置。
数据范围与约定
存在10%的数据,n=1。
存在40%的数据,n≤1,000。
存在40%的数据,m≤1,000。
存在40%的数据,T≤1,000,000。
对于100%的数据,n≤100,000,m≤1,000,000,000,T≤10^{18}。
具体地,数据范围如下表所示:
测试点编号 |
n |
m |
T |
1 |
=1 |
≤1,000 |
≤100,000 |
2,3 |
|
≤1,000 |
≤100,000 |
4,5 |
≤1,000 |
|
≤100,000 |
6,7 |
≤1,000 |
≤1,000 |
|
8 |
=1 |
|
|
9,10 |
≤1,000 |
|
|
11,12,13 |
|
≤1,000 |
|
14,15,16 |
|
|
≤100,000 |
17,18,19,20 |
|
这个数据范围一看我就吓坏了,但是思路还是有的。
由于是10W的N而且每面镜子只会被走两次【更多就证明它有循环,可以加记忆化解决】。
所以我们只要二分查找出当前方向遇到的第一面镜子是什么然后转向就好了 O(Nlog N*K)(K为常数字)。
说的简单做起来难自从这一题我再次认识到自己的编程实现能力有多弱。
二分打错了 6个二分没有一个是对的【其实也根本不用6个用 & (全局)可以完美解决】
调试无果决定重打但是时间已经不够了记忆化都没打上。
改题的时候我还是用了将近2h才打出来一个简单的搜索把我搞的这么狼狈不该不该
这次比赛让我充分认识到自己的编程能力的不足原来是260甚至300的分数现在只有160
我必须多打多练如同写作文一样:意在笔先。编程,就要“意在码先”,想清楚再打,一步一步慢慢打,不要嫌烦,更不要过分追求速度,稳才是王道。
PS:你问我为什么又不给代码?自己想吧少年!【其实CH你不用A题也能看到别人的代码TvT】