/* 1.先说下这题的思路,这题并不是难在代码,但是不太好想。正n边形的内角和为 (n-2)*180°,这个公式当时自然记得。 但是,有些别的点却是要自己想的,简述思路如下: 正n边形每个顶角的大小为 (n-2)*180/n° 对正n边形的任一顶点,除去它自己和相邻的两个顶点,该定顶点可以与剩余的 (n-3) 个顶点连成(n-3)条对角线,这些对角线可将该顶点对应的顶角分为(n-3)+1,即(n-2)个部分,每部分180/n° 于是正n边形任意三个顶点构成的角度的范围,则是从 180/n° ~ 180 * (n-2) /n° 2.为了方便输出,许多博客上的题解,都是采用固定前两个顶点,例如固定2 1,因为这样固定,目标答案所对应的角度,和第三个顶点的序号的的关系,比较容易能表示出来 3.这题还有值得一说的是,自己写的时候,突然发现WA,但是对比一下,发现没什么不同,最后才发现,是 "double angle = 180.0 / n;"这句,我忘了写.0 这里就有个提示:一般浮点数的加减乘除法一定要尤为注意,例如这题,如果我仅仅写 double angle = 180/n,它仅仅是将这部当作int型之间的除法,不会涉及到小数点,即便我定义的angle是double型,也是如此,不信可以自己尝试着输出一下 “cout << "test: " << angle << endl;”,即便是我们认为该得到小数的情况,它仍然向下取整 这点一定要尤其注意! 以及,这题还有一个略微容易WA的地方,每次循环都要更新mina,不然起不到mina取一个极大的数,来方便刷新最小值的作用 我自己敲的代码,参考自代码: http://blog.csdn.net/Richie_ll/article/details/74938016 此外,这个博客的代码,思路巧妙,在于固定两点,暴力求解第三点(上一个博客的代码也有用到);更在于,绕过了浮点数的精度问题,因为,在此题中,180/n的效果,和a *= n的效果是一样的,所以,就可以避开所有的double型数据,直接用int型处理,省去了浮点的加减乘除,可以绕开忘记加上.0造成的错误 http://blog.csdn.net/a664607530/article/details/73826319 以及再说说下面这个blog http://www.oyohyee.com/post/Codeforces/820B.html 本来想说它是因为,这是我看过的最好看的博客了,我指的是整个blog,感觉做得很是用心,希望当我学习网页时,也能自己做出这样一个blog 当然,最欣赏的是,他的blog里面关于ACM的干货挺多 同时也学到了一些写法: 1.#ifdef debug #endif,这是用读写文件的方式来核对输出的一个常用写法,好像其实是在入门经典看到过的,但平时没怎么用,羞愧 2.int START = clock(); printf("Time:%.3fs. ", double(clock() - START) / CLOCKS_PER_SEC); 这个似乎也是入门经典里面提到过的,可以得到代码运行时间 3.cin.tie(0); cin.sync_with_stdio(false); 这两句是能够加快 cin cout 的速度的,在TLE时可能会用到,就不必特意换成scanf和printf了 有关这个知识点的blog: http://www.hankcs.com/program/cpp/cin-tie-with-sync_with_stdio-acceleration-input-and-output.html http://blog.csdn.net/u010620604/article/details/50803163 http://blog.csdn.net/asx20042005/article/details/7365511 说明: 这串代码中的"double temp = (180 * i - t * i) / 2;" 虽然好像和 180.0/n*i 不太一样,但其实化简以后,得到的结果是一样的 */
#include <bits/stdc++.h> const double INF = 1e9; // min angle using namespace std; int main() { int n, a; while (cin >> n >> a) { double mina = INF; double angle = 180.0 / n; int mini = 0; for (int i = 1; i <= (n - 2); i++) if (fabs(angle * i - a) < mina) { mina = fabs (angle * i - a); mini = i; } cout << "2 1 " << 2 + mini << endl; } return 0; }