Codeforces Round #421 (Div. 2)B. Mister B and Angle in Polygon(模拟+精度控制)

传送门

题意

给出正n多边形和一个数a,寻找与a最接近的角,输出角编号

分析

找出多边形上所有角,一一比对即可

trick

1.判断的时候注意精度,i.e.x-eps>0
2.double与double相除时不要立刻转化成int,可能会有误差

代码

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define F(i,a,b) for(int i=a;i<=b;++i)
#define R(i,a,b) for(int i=a;i<b;++i)
#define mem(a,b) memset(a,b,sizeof(a))
//#pragma comment(linker, "/STACK:102400000,102400000")
//inline void read(int &x){x=0; char ch=getchar();while(ch<'0') ch=getchar();while(ch>='0'){x=x*10+ch-48; ch=getchar();}}
int check(double x)
{
	if(x>(1e-6)&&x<180-(1e-6)) return 1;return 0;
}
int n;
double a;
set<double>s;
int main()
{
	cin>>n>>a;
	double x=(n-2)*1.0/n*180,y=(180-x)/2,ret=y;
	while(check(x)&&check(y))
	{
		s.insert(x);s.insert(y);
		x-=ret,y+=ret;
	}
	double ans=1000,num;
	for(set<double>::iterator it=s.begin();it!=s.end();++it)
	{
		if(ans>abs((*it)-a)) {ans=abs((*it)-a);num=(*it);}
	}
	//printf("%f %f\n",num,ret);
	double k=num/ret;
	printf("%d %d %.f\n",2,1,2+k);
    return 0;
}
/*
13 4
100000 1
*/
posted @ 2017-07-04 15:10  遗风忘语  阅读(164)  评论(0编辑  收藏  举报