题意:给你一个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相关推荐

  1. 分类讨论 ---- 2020 icpc 上海 Walker (二分 or 思维分类讨论)

    题目链接 题目大意: 就是两个人在坐标轴上面,有起始的坐标p1,p2p1,p2p1,p2,和速度v1,v2v1,v2v1,v2,问你访问完这长度为nnn的数轴最短时间是多少? 解题思路: 大佬有直接二 ...

  2. CF1471 D - Strange Definition(思维,分类讨论,lcm,gcd的性质,数论)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #694 (Div. 2) D 很好的一道数论思维题 D - Str ...

  3. Unfair contest 模拟-分类讨论

    题意 : 两人比赛,n个裁判,给分范围[1,h][1, h][1,h],去掉s个最高分和t个最低分,给出n - 1个裁判的给分,第n个裁判想让第1个人赢,并且最小化给1的分数a[n]a[n]a[n] ...

  4. 2020ICPC(上海) - Walker(分类讨论+二分)

    题目链接:点击查看 题目大意:在长度为 n 的数轴上给出两个人的初始位置和速度,问使得每个位置至少被一个人走过的时间是多少 题目分析:分类讨论题目,分四种情况讨论即可,设 p1 < p2: p1 ...

  5. 【UOJ#33】【UR #2】树上GCD(长链剖分/根号分类讨论)

    [UOJ#33][UR #2]树上GCD 求解树上两个点到lca的距离的最大公约数是k的对数 首先我们很容易就想到莫比乌斯反演,那么利用倍数形式,我们只需要求解是i的倍数的对数. 考虑枚举lca,这个 ...

  6. uoj#246. 【UER #7】套路(dp+分块?分类讨论?)

    题目链接 分析: 目前为止我只能理解dp部分 我就喜欢这种单纯不做作的题目 一看名字就明白了这道题的本质 中二的题目描述 很显然,我们的关键就是求出最小相似度 朴素算法n^4 如果我们现在有一个权值数 ...

  7. Vasya and Multisets CodeForces - 1051C 模拟|分类讨论

    题意:把数组分成两个集合 每个集合中元素数量为1的个数相同(此个数可以是0) 分析: 这类问题就是要各种可能情况考虑到     然后分类讨论     完整地正确分类就AC     否则gg 如果数量为 ...

  8. P3842 [TJOI2007]线段(线性dp,分类讨论)

    P3842 [TJOI2007]线段 题意 [TJOI2007]线段 题目描述 在一个 n×nn \times nn×n 的平面上,在每一行中有一条线段,第 iii 行的线段的左端点是(i,Li)(i ...

  9. HDU 6627 equation(模拟,分类讨论)

    题意:给你n个ai和bi,给你C,求解方程: 分析:初中数学,分类讨论破除绝对值符号.每两个零点之间的区域都对应一个一元一次方程,把这些零点排序之后可以很容易得到每个区间的方程,每个区间都解一个一元一 ...

最新文章

  1. 策略模式的扩展——策略枚举
  2. c语言课程设计作业摇一摇,口才星教案第二册.doc
  3. Spring Boot集成Debezium监控数据库变化
  4. Spring 事务失效的 8 种场景!
  5. Android 系统(73)---Android判断你的应用在前台还是在后台
  6. leetcode题库:5.最长回文子串Longest Palindrome string
  7. 如何转换并压缩png格式图片
  8. [myeclipse] 官方中文网站
  9. 时间序列-N-CNN-LSTM
  10. 17.基于scrapy-redis两种形式的分布式爬虫
  11. lj2400恢复出厂_联想LJ2400加粉后如何清零
  12. 语音数字信号处理与分析及Matlab实现
  13. i2c驱动之at24c08(1)
  14. 博物馆管理系统解决方案
  15. MDClub 轻量级网论坛源码
  16. 叉乘点乘混合运算公式_小学数学所有公式和顺口溜都在这里了,考试肯定能用到!...
  17. 微信第三方平台全网发布返回Api/普通文本信息失败
  18. 用c++实现蓝桥杯超级玛丽
  19. 快速记忆英语单词计算机,电脑英语记单词软件哪个好循环记忆_怎么能快速记忆英语单词...
  20. AI:人工智能技术层企业简介(更新中)

热门文章

  1. codevs1080线段树练习
  2. Linux之du命令
  3. 在线URL转sitemap工具
  4. 渐变虚框及边框滚动的实现
  5. oracle快速创建可用用户
  6. 你在用MapGuide/Map 3D做什么?
  7. jbpm视频教程全集下载【21讲完整】
  8. Silverlight网络寻奇 at 090413
  9. 哈工大-基于内核栈切换的进程切换
  10. java 生日 计算_java根据生日计算当前年龄,精确到月