100837D
囤了一个星期。。今天看了下vj上 sysuteam7 三年半之前的代码。。
深刻地认识到了自己智商不足的问题。
先求出来每个点对中心的偏移量。
确实是乱序的,但是我们可以极角排序,这样一定是一个
循环移位匹配到另一个循环移位。
所以枚举n次就可以,check也十分简单
#include <bits/stdc++.h>
using namespace std;
typedef double db;
const db eps = 1e-;
const db pi = acos(-);
int sign(db k){
if(k>eps)return ;else if(k<-eps)return -;return ;
}
int cmp(db k1,db k2){ return sign(k1-k2);}
struct point{
db x,y;
point operator+(const point &k1)const { return point{x+k1.x,y+k1.y};}
point operator-(const point &k1)const { return point{x-k1.x,y-k1.y};}
point operator *(db k1)const{ return point{x*k1,y*k1};}
point operator/(db k1)const { return point{x/k1,y/k1};}
int operator == (const point &k1) const{return cmp(x,k1.x)==&&cmp(y,k1.y)==;}
bool operator<(const point k1)const {
int a = cmp(x,k1.x);
if(a==-)return ;else if(a==) return ;
else return cmp(y,k1.y)==-;
}
db abs(){ return sqrt(x*x+y*y);}
db abs2(){return x*x+y*y;}
db dis(point k1){ return ((*this)-k1).abs();}
point unit(){db w = abs(); return point{x/w,y/w};}
point turn90(){return point{-y,x};}
db getP()const{return sign(y)==-||(sign(y)==&&sign(x)==-);}
};
db cross(point k1,point k2){return k1.x*k2.y-k1.y*k2.x;}
db dot(point k1,point k2){return k1.x*k2.x+k1.y*k2.y;}
int compareangle (point k1,point k2){//[0,2pi]
return k1.getP()<k2.getP()||(k1.getP()==k2.getP()&&sign(cross(k1,k2))>)||(k1.getP()==k2.getP()&&sign(cross(k1,k2))==&&abs(k1.x)<abs(k2.x));
}
int n;
point a[],b[];
point o1,o2;
int main(){
//freopen("d.in","r",stdin);
//freopen("d.out","w",stdout);
scanf("%d",&n);
if(n==) return *printf("%.11f\n",0.0);
for(int i=;i<n;i++){
scanf("%lf%lf",&a[i].x,&a[i].y);
o1=o1+a[i];
}
for(int i=;i<n;i++){
scanf("%lf%lf",&b[i].x,&b[i].y);
o2=o2+b[i];
}
o1=o1/n,o2=o2/n;
for(int i=;i<n;i++){
a[i]=a[i]-o1,b[i]=b[i]-o2;
}
sort(a,a+n,compareangle);
sort(b,b+n,compareangle);
// printf("%.11f\n",a[0].abs());
// printf("%.11f\n",b[2].abs());
db ans = pi;
for(int i=;i<n;i++){//[0,n)~[i,i+n)
bool f=;
for(int j=;j<n;j++){
if(cmp(a[j].abs(),b[(i+j)%n].abs())!=){
f=;break;
}
}
if(f){
ans=min(ans,acos(dot(a[],b[i])/a[].abs()/b[i].abs()));
}
}
printf("%.11f\n",ans);
}
/**
先求出来每个点对中心的偏移量。
确实是乱序的,但是我们可以极角排序,这样一定是一个
循环移位匹配到另一个循环移位。
所以枚举n次就可以,check也十分简单
*/
100837D的更多相关文章
随机推荐
- MySql实现分页查询的SQL,mysql实现分页查询的sql语句 (转)
http://blog.csdn.net/sxdtzhaoxinguo/article/details/51481430 摘要:MySQL数据库实现分页查询的SQL语句写法! 一:分页需求: 客户端通 ...
- 2018-2019-2《Java程序设计》结对编程项目-四则运算 第一周 阶段性总结
码云链接 https://gitee.com/A5320/pair_programming_code 需求分析 实现一个命令行程序,要求: 1.自动生成小学四则运算题目(加.减.乘.除) 2.支持整数 ...
- [物理学与PDEs]第1章第3节 真空中的 Maxwell 方程组, Lorentz 力 3.2 Lorentz 力
1. Lorentz 假定, 不论带电体的运动状态如何, 其所受的力密度 (单位体积所受的力) 为 $$\bex {\bf F}=\rho {\bf E}+{\bf j}\times{\bf B} = ...
- APPLE-SA-2019-3-25-4 Safari 12.1
APPLE-SA-2019-3-25-4 Safari 12.1 Safari 12.1 is now available and addresses the following: Safari Re ...
- Django的项目创建,以及该端口号,语言随地区而变化
注:myway是项目的名称创建项目:cd wwwdjango-admin startproject mywaycd mywaypython manage.py runserver 如果想改Django ...
- CF1139C Edgy Trees
题目地址:CF1139C Edgy Trees 红黑树 \(ans\) 应该等于总数(\(n^k\))减去不含黑色边的序列数量 不含黑色边就意味着一个序列只能在一个红色联通块中 一个红色联通块中的序列 ...
- Windows下的wget,命令行下载url
1.进命令行(Win + R,输入"cmd") 2.输入:start powershell 3.等待PowerShell窗口启动 4.PowerShell窗口依次输入: $clie ...
- shiro执行原理
一.架构 要学习如何使用Shiro必须先从它的架构谈起,作为一款安全框架Shiro的设计相当精妙.Shiro的应用不依赖任何容器,它也可以在JavaSE下使用.但是最常用的环境还是JavaEE.下面以 ...
- Maven全局配置
Maven的全局配置文件是Maven安装目录conf/settings.xml文件,该文件可以配置仓库.代理.profile.镜像.插件等 <settings> <localRepo ...
- open live write 代码高亮插件的配置和使用
第一步:下载open live writer插件,下载地址:http://www.cnblogs.com/memento/p/5995173.html 第二步:找到open live writer的安 ...