UVA11186题解
题意简述
建立一个极坐标系,在一个圆心在极点,半径为
题目分析
其他题解中的算法时间复杂度为
首先我们分析一下圆周上三个点组成的三角形面积该如何求。如图所示,圆内接三角形的面积都可以由圆的面积减去三个弓形(绿色部分)的面积之和来求出。
那么,所有三角形面积之和就是
那么,对于每个弓形被减的次数已经知道了,只需要再计算出每个弓形的面积即可。对于两个点
最后给出代码:
#include<bits/stdc++.h> using namespace std; const double Pi=2*acos(0);//计算圆周率。 int n,r; double A[510],ans,th,s; int main() { while(scanf("%d%d",&n,&r)&& n&&r) { //为了方便,我将面积在最后才乘的 r*r。 ans=Pi*(n*(n-1)*(n-2)/6); for(int i=1;i<=n;i++) scanf("%lf",&A[i]),A[i]=A[i]*Pi/180.0;//转成弧度。 sort(A+1,A+n+1);//角度排序。 for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) { th=(A[j]-A[i])/2,s=th-cos(th)*sin(th);//th 为圆心角,s为小弓形面积(没乘 r*r)。 ans-=(j-i-1)*(Pi-s)+(n-j+i-1)*s;//减去弓形面积。 } ans*=r*r; printf("%.0lf\n",ans); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端