[TC6194]AllWoundUp
[TC6194]AllWoundUp
题目大意:
有\(A\)和\(B\)两个人。\(A\)在平面上游走,\(B\)会一直盯着\(A\)看,站在\(x\)轴某个位置上不动,并随着\(A\)的运动旋转身体。\(A\)的移动轨迹是一个闭合折线,包含\(n(n\le1000)\)条线段。试最大化\(B\)逆时针旋转的次数。
思路:
\(A\)的移动轨迹将\(x\)轴分成若干段。对于同一段上的点,无论\(B\)站在哪个位置效果都是一样的。枚举\(B\)所在的位置,枚举\(A\)移动路径上的每一条边,计算\(A\)令\(B\)旋转的角度即可。
源代码:
#include<cmath>
#include<vector>
#include<algorithm>
#define double long double
class AllWoundUp {
private:
static const int N=1000;
struct Point {
double x,y;
double operator * (const Point &rhs) const {
return x*rhs.y-y*rhs.x;
}
Point operator - (const Point &rhs) const {
return (Point){x-rhs.x,y-rhs.y};
}
double operator ^ (const Point &rhs) const {
return x*rhs.x+y*rhs.y;
}
};
Point p[N];
double c[N];
int n,m;
bool in(const double &x,const double &x1,const double &x2) const {
return std::min(x1,x2)<=x&&x<=std::max(x1,x2);
}
double calc(const Point &a,const Point &b) const {
return atan2(a*b,a^b);
}
int solve(const double &x0) const {
double angle=0;
const Point c=(Point){x0,0};
for(register int i=0;i<n;i++) {
const int j=(i+1)%n;
if(p[i].y==0&&p[j].y==0&&in(x0,p[i].x,p[j].x)) return 0;
angle+=calc(p[i]-c,p[j]-c);
}
return angle/M_PI/2;
}
public:
int maxWind(const std::vector<int> &v1,const std::vector<int> &v2) {
n=v1.size();
for(register int i=0;i<n;i++) p[i].x=v1[i];
for(register int i=0;i<n;i++) p[i].y=v2[i];
for(register int i=0;i<n;i++) {
const int j=(i+1)%n;
if(p[i].y*p[j].y>0||p[i].y==p[j].y) continue;
if(p[i].x!=p[j].x) {
const double k=(p[i].y-p[j].y)/(p[i].x-p[j].x);
const double b=p[i].y-k*p[i].x;
c[m++]=-b/k;
} else {
c[m++]=p[i].x;
}
}
if(m==0) return 0;
std::sort(&c[0],&c[m]);
m=std::unique(&c[0],&c[m])-c;
int ans=0;
for(register int i=1;i<m;i++) {
ans=std::max(ans,solve((c[i-1]+c[i])/2));
}
return ans;
}
};
[TC6194]AllWoundUp的更多相关文章
- topcoder srm 300 div1
problem1 link 直接模拟即可. import java.util.*; import java.math.*; import static java.lang.Math.*; public ...
随机推荐
- queue_delayed_work和queue_work区别 (转http://blog.csdn.net/dosculler/article/details/7968101)
queue_delayed_work和queue_work 一.参考文献: 1)http://www.linuxidc.com/Linux/2011-08/41655.htm queue_delaye ...
- java线上应用故障排查之二:高内存占用【转】
前一篇介绍了线上应用故障排查之一:高CPU占用,这篇主要分析高内存占用故障的排查. 搞Java开发的,经常会碰到下面两种异常: 1.java.lang.OutOfMemoryError: PermGe ...
- 在shell中如何判断字符串是否为有效的IP地址【转】
转自 在shell中如何判断字符串是否为有效的IP地址_echoisecho_新浪博客http://blog.sina.com.cn/s/blog_53a844e50100xxus.html 近来需要 ...
- caffe Python API 之Solver定义
from caffe.proto import caffe_pb2 s = caffe_pb2.SolverParameter() path='/home/xxx/data/' solver_file ...
- [转载]Windows服务编写原理及探讨(1)
有那么一类应用程序,是能够为各种用户(包括本地用户和远程用户)所用的,拥有用户授权级进行管理的能力,并且不论用户是否物理的与正在运行该应用程序的计算机相连都能正常执行,这就是所谓的服务了. (一)服务 ...
- 当while read line 遇到 ssh
问题:while read line 中使用ssh只能读取一行? #!/bin/sh while read line do echo $line ssh root@$line "echo 1 ...
- Nginx服务安全设置和参数调优
1.添加参数隐藏Nginx版本号 vim /application/nginx/conf/nginx.conf #http标签下添加 server_tokens off; #测试 [root@cobb ...
- Java多线程之赛跑游戏(含生成exe文件)
在JavaSE中,多线程是一个重要的内容. 我们要了解多线程的概念,就要先了解进程的概念:要了解进程的概念,就离不开操作系统的概念. 在一台正常运行的电脑中,计算机硬件(如CPU.内存.硬盘.网卡.显 ...
- Oracle Spatial操作geometry方法
Oracle Spatial中SDO_GEOMETRY类型: CREATE TYPE SDO_GEOMETRY AS OBJECT( SDO_GTYPE NUMBER,--几何类型,如点线面 SDO_ ...
- centos6.5 使用 rpm 安装 mysql
从mysql网站下载mysql rpm安装包(包括server.client) 1.安装server rpm -ivh MySQL-server-5.6.19-1.el6.x86_64.rpm 强制安 ...