2016级算法第六次上机-A.Bamboo之寻找小金刚
Bamboo之寻找小金刚
分析
可以抽象为许多连续线段,分别计数左拐和右拐的个数。考察叉积的基础应用。
假设ABC三点构成一个夹角∠ABC,B就是拐点,AC是辅助形成夹角。考虑线段AB和BC形成的向量
sin∠ABC= (AB * BC)/|AB|*|BC|
两个向量的叉乘除以它们的模
所以叉乘可以判断夹角是否大于180°从而确定转向。当然叉积是有方向的,可以自己选择哪条边在前,只要标准统一即可。每三个点组成一组,遍历,分别计数左拐数和右拐数。具体叉积相关操作可以看《算法导论》
注意
常见的一种陷阱是给出的数据范围明确在int范围内,但是计算过程中+-*/尤其是+-,是很可能导致数据暂时超出int范围的,所以建议用long long,或者计算时强制转化为long long
另外观察n的范围1<n,有一组只有两个点的边界情况,此时没有拐点
代码
const int maxx = 1e6 + 5;
struct point{
long long x, y;
}p[maxx];
long long dir(point pi, point pj, point pk)
{
return (pk.x - pi.x)*(pj.y - pi.y) - (pj.x - pi.x)*(pk.y - pi.y);
}
int main()
{
int n, a;
while (~scanf("%d%d", &n, &a))
{
for (int i = 0; i<n; i++)
{
scanf("%lld %lld", &p[i].x, &p[i].y);
}
long long left = 0, right = 0;
long long ans = a, temp;
if (n<3)ans = a;
else{
for (int i = 2; i<n; i++)
{
temp = dir(p[i - 2], p[i - 1], p[i]);
//printf("i=%d,temp =%d\n",i,temp);
if (temp<0){ left++; ans += left; }
else if (temp>0){ right++; ans -= right; }
}
}
printf("%lld\n", ans);
}
}
2016级算法第六次上机-A.Bamboo之寻找小金刚的更多相关文章
- 2016级算法第六次上机-E.Bamboo之吃我一拳
Bamboo之吃我一拳 分析 当两个点的距离<=d时,才可以出拳,想要使得满足出拳条件的点对最少但不为0 寻找最近点对距离,得到的最近距离能够使得可以出拳的组数最少,因为除了最近点对外其他组合均 ...
- 2016级算法第六次上机-F.AlvinZH的学霸养成记VI
1082 AlvinZH的学霸养成记VI 思路 难题,凸包. 分析问题,平面上给出两类点,问能否用一条直线将二者分离. 首先应该联想到这是一个凸包问题,分别计算两类点的凸包,如果存在符合题意的直线,那 ...
- 2016级算法第六次上机-G.ModricWang likes geometry
1116 ModricWang likes geometry 思路 难题,非常考察几何知识,放在这里作为计算几何场次的最难的题. 原题地址 原版题解 代码
- 2016级算法第六次上机-D.AlvinZH的学霸养成记V
1081 AlvinZH的学霸养成记V 思路 中等题,计算几何. 这是一个排序问题,按极角排序.可以转化为叉积的应用,对于点A和B,通过叉积可以判断角度大小,共线时再判断距离. 叉积的应用.OA × ...
- 2016级算法第六次上机-C.AlvinZH的学霸养成记II
1032 AlvinZH的学霸养成记II 思路 中等题,贪心. 所有课程按照DDL的大小来排序. 维护一个当前时间curTime,初始为0. 遍历课程,curTime加上此课程持续时间d,如果这时cu ...
- 2016级算法第六次上机-B.ModricWang's FFT : EASY VERSION
1114 ModricWang's FFT EASY VERSION 思路 利用FFT做大整数乘法,实际上是把大整数变成多项式,然后做多项式乘法. 例如,对于\(1234\),改写成\(f(x)=1* ...
- 2016级算法第五次上机-C.Bamboo和"Coco"
1064 Bamboo和"Coco" 分析题意 每个亡灵至少一个花瓣,相邻的亡灵中思念值高的要获得的花瓣高(思念值相等是不需要花瓣一样多的).主要考贪心思路,为了使得花瓣总量最少, ...
- 2016级算法第五次上机-B.Bamboo&APTX4844魔发药水
Bamboo&APTX4844魔发药水 题意 "于是,Bamboo耐着性子,看巫师从袖子里掏出 M 瓶时光泉水和 K 粒绿色能量.每瓶时光泉水重量为 c ,生发效果为 l:每粒绿色能 ...
- 2016级算法第四次上机-E.Bamboo and the Ancient Spell
Bamboo and the Ancient Spell 分析 可能英文读题难度比较大,但是只要看到全大写的 "THE LONGEST COMMON SUBSEQUENCE !"应 ...
随机推荐
- mybatis调用自定义函数
<select id="getFunction" parameterType="int" resultType="string"> ...
- 打劫房屋 · House Robber
[抄题]: 假设你是一个专业的窃贼,准备沿着一条街打劫房屋.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警 ...
- jetty tutorial
http://www.eclipse.org/jetty/documentation/current/embedding-jetty.html#d0e18726 Version: 9.2.2-SNAP ...
- [模板]tarjan缩点+拓扑排序
题目:给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 题目简述:先t ...
- promise、resolve、reject、拦截响应
Promise是一个接口,它用来处理的对象具有这样的特点:在未来某一时刻(主要是异步调用)会从服务端返回或者被填充属性.其核心是,promise是一个带有then()函数的对象. 使用promise机 ...
- Basic4android v3.00 发布
这次发布的版本主要是增加了快速debuger. 在运行时,可以在IDE 里面随时修改代码,而不需要重新发布应用. 大大提高了开发效率. Basic4android v3.00 is released. ...
- centos7下载自定义仓库的镜像设置方法
1.vim /usr/lib/systemd/system/docker.service Description=Docker Application Container Engine Documen ...
- Python之模块和包学习
模块简介 python是由一系列的模块组成的,每个模块就是一个py为后缀的文件,同时模块也是一个命名空间,从而避免了变量名称冲突的问题.模块我们就可以理解为lib库,如果需要使用某个模块中的函数或对象 ...
- [label][转载][JavaSript]querySelectorAll 方法相比 getElementsBy 系列方法有什么区别?
轉載出處: http://www.zhihu.com/question/24702250 querySelectorAll 相比下面这些方法有什么区别? getElementsByTagName g ...
- Firefox mobile (android) and orientationchange
Firefox for Android does not support the orientationchange event but you can achieve the same result ...