codeforces 801 D. Volatile Kite(数学题)
2024-09-25 18:32:14
题目链接:http://codeforces.com/contest/801/problem/D
题意:求出一个最大值D,使得一个给定的凸多边形任意点移动范围在半径为D的圆中,都不会构成一个凹都边形。
还有给出的多边形的点是按顺时针给出的。
题解:要使的任意点移动都不构成凹多边形,显然只要最极限的移动状态就是相邻的3个点在同一直线上。
于是只要遍历一遍所有的点然后计算出该点到相邻两点构成的直线距离d。D=min(d[i]/2);
所以这题还会用到一个公式点到线的距离
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;
const int M = 1e3 + 10;
double x[M] , y[M];
double getd(int pos , double a , double b , double c) {
return abs((a * x[pos] + b * y[pos] + c) / sqrt(a * a + b * b));
}
double cau(int a , int b , int c) {
double A , B , C;
A = (y[b] - y[c]) , B = x[c] - x[b] , C = (x[b] - x[c]) * y[b] - (y[b] - y[c]) * x[b];
return getd(a , A , B , C);
}
int main() {
int n;
scanf("%d" , &n);
for(int i = 0 ; i < n ; i++) {
scanf("%lf%lf" , &x[i] , &y[i]);
}
double D = 1.0 * 1e12;
for(int i = 0 ; i < n ; i++) {
if(i == n - 1) {
D = min(D , cau(i , i - 1 , 0));
}
else if(i == 0) {
D = min(D , cau(i , n - 1 , 1));
}
else {
D = min(D , cau(i , i - 1 , i + 1));
}
}
printf("%.10lf\n" , D / 2);
return 0;
}
最新文章
- Android handler的使用简单示例
- wordpress 安装 ";Table Prefix"; must not be empty.
- [Silverlight]监听指定控件(FrameworkElement)的依赖属性(DependencyProperty)的更改
- [蟒蛇菜谱]Python日志记录最佳实践
- CentOS linux下安装和配置Apache+SVN(用浏览器http方式访问SVN目录)
- 使用jailkit chroot更改ssh用户根目录
- Sybase PowerDesign 导入数据库结构formSqlserver
- The error occurred while setting parameters--索引 3 超出范围 sqlserver2008
- 【随笔】vmstat性能监测
- 运行QQ出现initialization failure 0x0000000c错误和浏览器上不了网
- python三级菜单
- KMP算法的C++实现
- 如何设置table的border-radius?
- TSSAO Temporal Screen-Space Ambient Occlusion (Unity3d 5 示例实现)
- 【转】AngularJs $location获取url参数
- 在SQL Server中添加Linked Server 图解版
- MongoDB学习2
- Chrome 自动填充的表单是淡黄色的背景怎么办!
- HDU-4371-Alice and Bob
- 【kafka学习之六】kakfa消息生产、消费示例