Educational Codeforces Round 87 (Rated for Div. 2) C2.Not So Simple Polygon Embedding

写了一种不太快但是比较好理解的代码:
大致就是二分(这里二分应该是可以O(1)的)
先让整个2n边形的某个顶点对着(1,0),在这种情况下以(0,0)为中心构造的正方形显然不是最小的。我们也可以发现只需要绕着原点转一个角度就能够造出最小的正方形:可以画一画发现,旋转的角度为 π 4 n \frac{\pi}{4n} 4nπ
然后对于C1的代码,只要把二分函数里的now角度改一下就好了

const int N=200010,M=N*2,mod=1e9+7;
int n,m,k,a[N];
string p;
double angle;

bool check(double w){
	w/=2.0;
	double tmp=(PI-angle)/2.0;
	double r=sin(tmp)/sin(angle);
	// debug(r);
	double now=PI/(4.0*n);
	bool ok=true;
	for(int i=0;i<n*2;++i){
		double x=r*cos(now),y=r*sin(now);
		if(sign(x-w)>0||sign(x+w)<0||sign(y-w)>0||sign(y+w)<0) {
			ok=false;
			break;
		}
		now += angle;
	}
	if(ok) return ok;
	now=0;ok=true;
	for(int i=0;i<n*2;++i){
		double x=r*cos(now),y=r*sin(now);
		if(sign(x-w)>0||sign(x+w)<0||sign(y-w)>0||sign(y+w)<0) {
			return false;
		}
		now += angle;
	}
	return true;
}

void solve(){
	double one=PI/180.0;
	scanf("%d",&n);	
	angle=PI/n;
	double l=1,r=1e18;
	int cnt=200;
	while(cnt--){
		double mid=(l+r)/2.0;
		if(check(mid)) r=mid;
		else l=mid;
	}
	printf("%.10lf\n",l);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值