[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的更多相关文章

  1. topcoder srm 300 div1

    problem1 link 直接模拟即可. import java.util.*; import java.math.*; import static java.lang.Math.*; public ...

随机推荐

  1. 浅谈Stein算法求最大公约数(GCD)的原理及简单应用

    一.Stein算法过程及其简单证明 1.一般步骤: s1:当两数均为偶数时将其同时除以2至至少一数为奇数为止,记录除掉的所有公因数2的乘积k: s2:如果仍有一数为偶数,连续除以2直至该数为奇数为止: ...

  2. 【译】第二篇 SQL Server代理作业步骤和子系统

    本篇文章是SQL Server代理系列的第二篇,详细内容请参考原文. SQL Server代理作业由一系列的一个或多个作业步骤组成.一个作业步骤分配给一个特定的作业子系统(确定作业步骤去完成的工作). ...

  3. 商城项目(ssm+dubbo+nginx+mysql统合项目)总结(1)

    我不会在这里贴代码和详细步骤什么的,我觉得就算我把它贴出来,你们照着步骤做还是会出很多问题,我推荐你们去看一下黑马的这个视频,我个人感觉很不错,一步一步走下来可以学到很多东西.另外,视频和相关文档的话 ...

  4. java中的matches -> 完全匹配

    matches是完全匹配.跟matcher不一样, matcher像perl正则, 能匹配到符合的都会返回true, 而这个matches要完全一模一样才行. import java.util.reg ...

  5. 不相交集ADT--链表实现

    每一个集合用用一个链表来表示.链表的第一个对象作为它所在集合的代表.链表中每个对象都包含一个集合成员,一个指向下一个对象的指针,以及指向代表的指针.每个链表含head和tail指针,head指向链表的 ...

  6. (转)USB协议简介

    USB协议简介     USB是一种协议总线,即主机与设备之间的通信需要遵循一系列约定.协议内容较多,这里仅作一些简单介绍,深入学习,可参看USB规范(WWW.usb.org).     为了理解协议 ...

  7. C/C++——库函数strcpy和strdup比较

    版权声明:原创文章,禁止转载. 1. strcpy 原型: extern char *strcpy(char *dest,char *src); 用法: #include <string.h&g ...

  8. 当while read line 遇到 ssh

    问题:while read line 中使用ssh只能读取一行? #!/bin/sh while read line do echo $line ssh root@$line "echo 1 ...

  9. PHP中的魔术方法和关键字

    PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...

  10. UTF-8和GB2312互转的最简单快捷的方法

    一.如果你想把utf-8转为GB2312 1.用记事本打开源码,把<meta http-equiv="Content-Type" content="text/htm ...