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 MHA架构搭建过程
[环境介绍] 系统环境:Red Hat Enterprise Linux 7 + 5.7.18 + MHA version 0.57 系统 IP 主机名 备注 版本 xx系统 192.168.142. ...
- 【Java】Java随手记
System.out.printf() : System.out.printf("%d",x); 输出整数 System.out.printf(&quo ...
- 计算机视觉学习记录 - Implementing a Neural Network from Scratch - An Introduction
0 - 学习目标 我们将实现一个简单的3层神经网络,我们不会仔细推到所需要的数学公式,但我们会给出我们这样做的直观解释.注意,此次代码并不能达到非常好的效果,可以自己进一步调整或者完成课后练习来进行改 ...
- 【转】Python3 (入门6) 库的打包与安装
Python3 (入门6) 库的打包与安装 本文由 Luzhuo 编写,转发请保留该信息. 原文: http://blog.csdn.net/Rozol/article/details/6940288 ...
- 【easy】215. Kth Largest Element in an Array 第K大的数
class Solution { public: int quicksort(vector<int>& nums, int start, int end, int k){ int ...
- [C]\x字符转义序列
概述 \x转义的定义是这样的 转义符 字符值 输出结果 \xh[h...] 具有此十六进制码的字符 输出此字符 问题 看似\x后面可以接受1或n个十六进制的字符,但是如果你把一个 ...
- 通过mysqlbinlog 恢复数据
前提数据库开启了bin_log记录日志. 查看日志 刷新日志 flush logs; 再次查看 show binary logs; 向表中插入一条数据 现在执行delete误操作,删除所有的数据. d ...
- 进入js
JavaScript概述 ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript提交给国际标准化组织ECM ...
- CSS之三个模型 盒子模型 轮廓模型 内外边距
盒子模型 最终元素的总宽度计算公式是这样的: 总元素的宽度=宽度+左填充+右填充+左边框+右边框+左边距+右边距 元素的总高度最终计算公式是这样的: 总元素的高度=高度+顶部填充+底部填充+上边框+下 ...
- PHP二维数组按某个字段排序
//准备 二维数组 //按一个字段排序 foreach($rank as $key=>$val){ $dos[$key] = $val['timelength']; } array_multis ...