/*
题目描述:
有一个密度均匀的平面N多边形(3 <= N <= 1000000),可能凹也可能凸,但没有边相交叉,
另外已知N个有序(顺时针或逆时针)顶点的坐标值,第j个顶点坐标为(Xi , Yi ),且满
足 (|Xi|, |Yi| <= 20000),求这个平面多边形的重心。
解题过程:
从第1个顶点出发,分别连接第i, i+1个顶点组成三角形Ti,1 < i < n,
一共n-2个三角形正好是多连形的一个划分,分别求出每个三角形的面积Si,
总面积为各个面积相加
根据物理学知识得:n个点(xi,yi)每个重量是mi,则重心是
X = (x1*M1+x2*M2+...+xn*Mn) / (M1+M2+....+Mn)
Y = (y1*M1+y2*M2+...+yn*Mn) / (M1+M2+....+Mn)
另个需要用的知识有:
已知3点求三角形的面积,设三点分别为p[0].x, p[0].y p[1].x, p[1].y p[1].x, p[1].y
面积s =[ p[0].x*p[1].y-p[1].x*p[0].y + p[1].x*p[2].y-p[2].x*p[1].y + p[2].x*p[0].y-p[0].x*p[2].y ] / 2 ,
这里的面积是指有向面积,当三个顶点呈逆时针排列,有向面积为正。逆时针,面积为负。三点共线,面积为零。
这是这3个点是逆时针的值,顺时针取负。
已知3点求重心,x = (p[0].x+p[1].x+p[2].x)/3.0 , y = (p[0].y+p[1].y+p[2].y)/3.0
另外在求解的过程中,不需要考虑点的输入顺序是顺时针还是逆时针,相除后就抵消了,
还要注意 一点是不必在求每个小三角形的重心时都除以3,可以在最后除一下
*/
#include<stdio.h>
#include<math.h>
int n;
double x[1000005],y[1000005],ansx,ansy,answ;
double calw(int s)
{
double ans;
ans=x[0]*y[s]+x[s]*y[s+1]+x[s+1]*y[0]
-x[s]*y[0]-x[0]*y[s+1]-x[s+1]*y[s];
return ans;
}
void calans()
{
int i,j;
double xx,yy,ww;
ansx=ansy=answ=0;
for(i=1;i<n-1;i++)
{
xx=(x[0]+x[i]+x[i+1]);//刚开始是这里除以三,wa了
yy=(y[0]+y[i]+y[i+1]);
ww=calw(i);
ansx+=xx*ww;
ansy+=yy*ww;
answ+=ww;
}
ansx/=answ;
ansy/=answ;
printf("%.2f %.2f\n",ansx/3,ansy/3);//之后改成这里除以三,就ac了,why??
}
int main()
{
int i,j,t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%lf%lf",&x[i],&y[i]);
calans();
}
return 0;
}
分享到:
相关推荐
For a positive integer n, let’s denote function f(n,m) as the m-th smallest integer x that x>n and gcd(x,n)=1. For example, f(5,1)=6 and f(5,5)=11. You are given the value of m and (f(n,m)?n)⊕n,...
The least common multiple (LCM) of a set of positive integers is the smallest positive integer which is divisible by all the numbers in the set. For example, the LCM of 5, 7 and 15 is 105. Input Input...
HDU的1250,主要是利用高精度加法,但是代码有点繁琐,效率不是很高
« ACM模板收集Let the Balloon Rise » Catalan数 Catalan numbers 的公式: Cn=C(2n,n)/(n+1);1 Cn+1=C(2n+2,n+1)/(n+2);2 由1和2推出 Cn/C(n+1)=(n+2)/(4n+2); 而且,对于一个具有n个节点的数的形态的...
2019 Multi-University Training Contest 4(2019hdu多校第六场数据与标程)
ACM HDU 2000->2099 解题报告 ACM HDU 2000->2099 解题报告 ACM HDU 2000->2099 解题报告
Hdu 3333解题报告 题意描述: 给你n个数现在要你求在k个区间上[ai, bi]的不相同的数之和各是多少. N,000; k,000; 显然,这题不能用暴力来做。 这题我们选择用线段数来做。
此程序为hdu的acm2010题,就是解决水仙花数问题
杭电hdu acm资料所用杭电的acm题
包含实验内容:对应实验要求上的1/2/3/5实验,分别为setName/setNice,petree输出进程,模拟shell,进程通信,文件系统。包含全部实验源代码和详尽的word实验报告。同时包含在线PTA编程题目:进程模拟,模拟进程调度...
HDU一部分题目原码,大部分是可运行的,可能有几题不完整
杭电 hdu acm 第1084题的解法,ac过了,是一位学长教我的.内有一些中文说明.
(HDUACM2010版_08)母函数(HDUACM2010版_08)母函数(HDUACM2010版_08)母函数(HDUACM2010版_08)母函数(HDUACM2010版_08)母函数(HDUACM2010版_08)母函数
hdu 1005.比较简单的一道题,有兴趣的可以看看。
ACM HDU题目分类,我自己总结的大概只有十来个吧
hdu-acm源代码(上百题)hdu-acm源代码、hdu-acm源代码hdu-acm源代码
压缩包包含十份报告,已经通过验收,实验内容:交换机、生成树、静态路由、NAT等完全根据教材实验要求
100道 acm C语言 hdu 解题报告
ACM hdu 代码大全3000例,hdu已经AC的3000例代码,部分代码有详细解析
HDU1059的代码