Codeforces Round #421 (Div. 2) | B. Mister B and Angle in Polygon

来源:互联网 发布:怎么改mac的用户名 编辑:程序博客网 时间:2024/06/16 06:26

题意

一个正n边行,任意三个顶点可以构成一个角,给定一个角度a,求哪三个顶点构成的角与a的差值最小,任意输出一个即可。(3 ≤ n ≤ 10^5, 1 ≤ a ≤ 180)

解题思路

这里写图片描述
正3边形可构成的角度为60
正4边形可构成的角度为45,90
正5边形可构成的角度为36,72,108
正6边形可构成的角度为30,60,90,120

正n边形可构成的角度为180n,2180n,…,(n2)180n
所以以1和2为基准,从3开始向n遍历,遍历一遍每个角度,求出差值最小值。
注意double值的比较不能直接比较。

参考代码

#include <bits/stdc++.h>using namespace std;typedef long long ll;int main(){    int n,a;    while (cin>>n>>a){        double k=1.0*180/n;        double tmp=abs(a-k);        int ans=3;        for (int i=3;i<=n;i++){            double ang=(i-2)*k;            double tmp2=abs(ang-a);            if (tmp-tmp2>1e-9){                tmp=tmp2;                ans=i;            }        }        cout<<ans<<" 1 2"<<endl;    }    return 0;}
阅读全文
0 0
原创粉丝点击