Codeforces Beta Round #1 解题报告
uno
posted @ 2011年9月27日 09:34
in Codeforces 解题报告
with tags
codeforces
, 1590 阅读
A
水题,不解释。
B
简单模拟题,变种进制转换。
按照规则处理即可,但是要注意的一点是,这道题不是普通的进制转换,1对应A,26对应Z,27对应AA,0是没有字母对应的。
ans[LEN]是存储字符串的数组,col为列数。
while(col) { col--; ans[pos++]=col%26+'A'; col/=26; }
C
很好的计算几何题。
题意:给定三个点,求包含这三个点的最小的正多边形的面积,边数不超过100。
解题的关键在于平面解析几何的知识。
首先把三个点连接成三角形ABC,然后作这个三角形的外接圆。假设其中一条边为AB,两端点的圆弧间有k个点(即正多边形的端点,P1,P2,...,Pk),由于正多边形的每条边对应圆心角相等,所以AOB=(k+1)AOP1,满足这样的关系的正多边形即为所求。
由于边数不大,所以枚举边数+判断就可以了。
还要注意的一点就是精度。
#include <iostream> #include <cmath> using namespace std; const double pi=acos(-1.0); const double eps=1e-4; struct point { double x,y; }; double dist(point a,point b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } int main() { point p[3]; double dis[3]; double angle; double pp,s,d; int i,j,k; while(scanf("%lf%lf%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[1].x,&p[1].y,&p[2].x,&p[2].y)!=EOF) { for(i=0;i<3;i++) dis[i]=dist(p[i],p[(i+1)%3]); pp=(dis[0]+dis[1]+dis[2])/2; s=sqrt(pp*(pp-dis[0])*(pp-dis[1])*(pp-dis[2])); d=dis[0]*dis[1]*dis[2]/s/2; for(i=3;i<101;i++) { angle=2*pi/i; for(j=0;j<3;j++) if(fmod(2*asin(dis[j]/d)+eps/10,angle)>eps)break; if(j==3) { printf("%.8lf\n",i*d*d*sin(2*pi/i)/8); break; } } } return 0; }