【计算几何】【分类讨论】Gym - 101243I - Land Division
题意:给你一个n个点的凸包,让你切一刀,使得它变成一个m边形和一个K边形,问你切的这一刀最短是多少。
如果m+K==n+4,那么一定切在两条边上,但是由于两个线段间的最短距离,至少会经过一条线段的一个端点,于是可以枚举其中一条边,然后算出另一条边,然后枚举4个端点到对面线段的距离,取最小值即可。
如果m+K==n+3,那么一定切在一个点和一个边上,可以枚举那个点,算出顺时针和逆时针方向切到的那条边是谁,然后更新答案。
如果m+K==n+2,那么一定切在两个点上,可以枚举其中一个点,算出顺时针和逆时针方向切到的另外一个点是谁,然后更新答案。
其他情况无解。
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
double ans=99999999999999.0;
struct Point{int x,y;Point(const int &x,const int &y){this->x=x;this->y=y;}Point(){}double Length(){return sqrt((double)x*(double)x+(double)y*(double)y);}void read(){scanf("%d%d",&x,&y);}
}p[105];
typedef Point Vector;
Vector operator - (const Point &a,const Point &b){return Vector(a.x-b.x,a.y-b.y);
}
int Dot(const Vector &a,const Vector &b){return a.x*b.x+a.y*b.y;
}
int Cross(const Vector &a,const Vector &b){return a.x*b.y-a.y*b.x;
}
int n,m,K;
double DisToSegment(Point P,Point A,Point B)
{Vector v1=B-A,v2=P-A,v3=P-B;if(Dot(v1,v2)<=0) return v2.Length();else if(Dot(v1,v3)>0) return v3.Length();else return fabs((double)Cross(v1,v2))/v1.Length();
}
double Min(double a,double b,double c,double d,double e){return min(a,min(b,min(c,min(d,e))));
}
//double Min(double a,double b,double c){
// return min(a,min(b,c));
//}
int main(){freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);scanf("%d%d%d",&n,&m,&K);for(int i=0;i<n;++i){p[i].read();}if(m+K==n+4){if(m==3 || m==n+1){puts("0.000");return 0;}for(int i=0;i<n;++i){int j=(i+m-2)%n;ans=Min(ans,DisToSegment(p[i],p[j],p[(j+1)%n]),DisToSegment(p[(i+1)%n],p[j],p[(j+1)%n]),DisToSegment(p[j],p[i],p[(i+1)%n]),DisToSegment(p[(j+1)%n],p[i],p[(i+1)%n]));}printf("%.3lf\n",ans);}else if(m+K==n+3){for(int i=0;i<n;++i){int j=(i+m-2)%n;ans=min(ans,DisToSegment(p[i],p[j],p[(j+1)%n]));j=(i-(m-2)+n)%n;ans=min(ans,DisToSegment(p[i],p[j],p[(j-1+n)%n]));}printf("%.3lf\n",ans);}else if(m+K==n+2){for(int i=0;i<n;++i){int j=(i+m-1)%n;ans=min(ans,(p[i]-p[j]).Length());j=(i-(m-1)+n)%n;ans=min(ans,(p[i]-p[j]).Length());}printf("%.3lf\n",ans);}else{puts("-1");}return 0;
}
转载于:https://www.cnblogs.com/autsky-jadek/p/7625790.html
【计算几何】【分类讨论】Gym - 101243I - Land Division相关推荐
- 分类讨论 ---- 2020 icpc 上海 Walker (二分 or 思维分类讨论)
题目链接 题目大意: 就是两个人在坐标轴上面,有起始的坐标p1,p2p1,p2p1,p2,和速度v1,v2v1,v2v1,v2,问你访问完这长度为nnn的数轴最短时间是多少? 解题思路: 大佬有直接二 ...
- CF1471 D - Strange Definition(思维,分类讨论,lcm,gcd的性质,数论)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #694 (Div. 2) D 很好的一道数论思维题 D - Str ...
- Unfair contest 模拟-分类讨论
题意 : 两人比赛,n个裁判,给分范围[1,h][1, h][1,h],去掉s个最高分和t个最低分,给出n - 1个裁判的给分,第n个裁判想让第1个人赢,并且最小化给1的分数a[n]a[n]a[n] ...
- 2020ICPC(上海) - Walker(分类讨论+二分)
题目链接:点击查看 题目大意:在长度为 n 的数轴上给出两个人的初始位置和速度,问使得每个位置至少被一个人走过的时间是多少 题目分析:分类讨论题目,分四种情况讨论即可,设 p1 < p2: p1 ...
- 【UOJ#33】【UR #2】树上GCD(长链剖分/根号分类讨论)
[UOJ#33][UR #2]树上GCD 求解树上两个点到lca的距离的最大公约数是k的对数 首先我们很容易就想到莫比乌斯反演,那么利用倍数形式,我们只需要求解是i的倍数的对数. 考虑枚举lca,这个 ...
- uoj#246. 【UER #7】套路(dp+分块?分类讨论?)
题目链接 分析: 目前为止我只能理解dp部分 我就喜欢这种单纯不做作的题目 一看名字就明白了这道题的本质 中二的题目描述 很显然,我们的关键就是求出最小相似度 朴素算法n^4 如果我们现在有一个权值数 ...
- Vasya and Multisets CodeForces - 1051C 模拟|分类讨论
题意:把数组分成两个集合 每个集合中元素数量为1的个数相同(此个数可以是0) 分析: 这类问题就是要各种可能情况考虑到 然后分类讨论 完整地正确分类就AC 否则gg 如果数量为 ...
- P3842 [TJOI2007]线段(线性dp,分类讨论)
P3842 [TJOI2007]线段 题意 [TJOI2007]线段 题目描述 在一个 n×nn \times nn×n 的平面上,在每一行中有一条线段,第 iii 行的线段的左端点是(i,Li)(i ...
- HDU 6627 equation(模拟,分类讨论)
题意:给你n个ai和bi,给你C,求解方程: 分析:初中数学,分类讨论破除绝对值符号.每两个零点之间的区域都对应一个一元一次方程,把这些零点排序之后可以很容易得到每个区间的方程,每个区间都解一个一元一 ...
最新文章
- 策略模式的扩展——策略枚举
- c语言课程设计作业摇一摇,口才星教案第二册.doc
- Spring Boot集成Debezium监控数据库变化
- Spring 事务失效的 8 种场景!
- Android 系统(73)---Android判断你的应用在前台还是在后台
- leetcode题库:5.最长回文子串Longest Palindrome string
- 如何转换并压缩png格式图片
- [myeclipse] 官方中文网站
- 时间序列-N-CNN-LSTM
- 17.基于scrapy-redis两种形式的分布式爬虫
- lj2400恢复出厂_联想LJ2400加粉后如何清零
- 语音数字信号处理与分析及Matlab实现
- i2c驱动之at24c08(1)
- 博物馆管理系统解决方案
- MDClub 轻量级网论坛源码
- 叉乘点乘混合运算公式_小学数学所有公式和顺口溜都在这里了,考试肯定能用到!...
- 微信第三方平台全网发布返回Api/普通文本信息失败
- 用c++实现蓝桥杯超级玛丽
- 快速记忆英语单词计算机,电脑英语记单词软件哪个好循环记忆_怎么能快速记忆英语单词...
- AI:人工智能技术层企业简介(更新中)