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的更多相关文章
随机推荐
- 第三节: Quartz.Net五大构件之Scheduler(创建、封装、基本方法等)和Job(创建、关联等)
一. 五大构件 引言: Quartz.Net的五大构件 1. 调度器:Scheduler 2. 作业任务:Job 3. 触发器: Trigger 4. 线程池: SimpleThreadPoo ...
- burp Suite 模块Authz 使用方法
这个模块是朋友告诉我的,然后进行了研究使用方法. 以下为个人理解,如有错误感谢各位纠正. 0x00 安装Authz Extender > BApp Store > Authz > i ...
- 一个QQ旋风的BUG
本人喜欢用QQ旋风下载工具,很不幸的是这个工具BUG太多了. 下载不同COOKIE,相同文件名.URL的文件时候会QQ旋风崩溃. 感兴趣可以试下.
- python 实现简单卷积网络框架
第一步定义卷积核类: class Filter(object): # 滤波器类 对卷积核进行初始化 def __init__(self,width,height,depth): # initializ ...
- css和css3弹性盒模型实现元素宽度(高度)自适应
一.css实现左侧宽度固定右侧宽度自适应 1.定位 <!DOCTYPE html> <html lang="en"> <head> <me ...
- Git上传文件容量大小限制
使用Git LFS突破git的100M容量限制. 1.安装Git LFS https://git-lfs.github.com./ 2.安装后把里面的git-lfs.exe放到你要上传的项目文件夹 3 ...
- Java并发之Thread类的使用
一.线程的几种状态 线程从创建到最终的消亡,要经历若干个状态.一般来说,线程包括以下这几个状态:创建(new).就绪(runnable).运行(running).阻塞(blocked).time wa ...
- JavaScript入门(基础)
一.JS语言介绍 1.概述 浏览器脚本语言 可以编写运行在浏览器上的代码程序 属于解释性.弱语言类型编程语言 2.组成 ES语法:ECMAScript.主要版本有ES5和ES6 DOM:文档对象模型( ...
- Emacs Org-mode 2 文档结构
2.1 章节 org-mode用* 标识章节,一个* 代表一级标题,两个* 代表两级标题,以此类推.最多6颗星,也就是最多6级. 书写格式如下: * 标题一 ** 标题二 注意, * 后有空格.不同的 ...
- 金蝶K/3 BOS产品培训教案
K/3 BOS产品培训教案 1 K/3 BOS IDE练习案例... 2 1.1新建基础资料... 2 1.1.1新增基础资料交货地点... 2 1.2新建业务单据... 2 1.2.1新建寄 ...