POJ 1265 Area
开始做的时候研究了好久,表示压力山大。后来表示,竟然有Pick定理
多边形S面积 = 多边形内部点数 + 边上的点数/2 -1;
面积和边上的点数都为实数
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<stdio.h>
#include<cstring>
using namespace std;
int cross(int x1,int x2,int y1,int y2)
{
return x1*y2-x2*y1;
}
int Gcd( int a, int b )
{
int r; a=abs(a),b=abs(b);
while( b!= 0 )
{
r= b;
b= a % b;
a= r;
}
return a;
}
int main()
{
int i,j,k,ncase,n,tx,ty;
int x,y,newx,newy,on,in;
__int64 ans;
cin>>ncase;
k=0;
while(ncase--)
{
k++;
cin>>n;
x=0,y=0,ans=0,on=0;
for(i=0;i<n;i++)
{
scanf("%d%d",&tx,&ty);
newx=x+tx;
newy=y+ty;
ans+=cross(x,y,newx,newy); ///求多面体面积,叉积计算向量的四边形面积 结果除以2
x=newx;
y=newy;
on+=Gcd(tx,ty); ///求最大公约数计算边界所含有的点数
}
in= ( ans- on+ 2 )/ 2; ///多边形S面积=多边形内部点数+边上的点数/2-1面积和边上的点数都为实数
printf("Scenario #%d:\n%d %d %.1lf\n\n",k,in,on,ans/2.0);
}
return 0;
}
/*********************************************************************************/
POJ 2954 Traingle
和上一题差不多,更简单了
不过看了status 表示对那些能把内存压缩到12K的大牛们膜拜~~~~尝试了几次后始终164K,差距啊!!!
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#include<cmath>
int cross(int x1,int y1,int x2,int y2,int x3,int y3)
{
return abs((x3-x1)*(y2-y1)-(x2-x1)*(y3-y1));
}
int Gcd( int a, int b )
{
int r; a=abs(a),b=abs(b);
while( b!= 0 )
{
r= b;
b= a % b;
a= r;
}
return a;
}
int main()
{
int i,j,newa,newb,a,b,on,in;
int x[3],y[3];
__int64 ans;
while(scanf("%d%d%d%d%d%d",&x[0],&y[0],&x[1],&y[1],&x[2],&y[2]))
{
if(x[0]==0 && y[0]==0 && x[1]==0 && y[1]==0 && x[2]==0 && y[2]==0)
return 0;
ans=0,newa=0,newb=0,on=0,in=0;
ans=cross(x[0],y[0],x[1],y[1],x[2],y[2]);
on=Gcd(x[1]-x[0],y[1]-y[0])+Gcd(x[2]-x[1],y[2]-y[1])+Gcd(x[0]-x[2],y[0]-y[2]);
if(ans<0)
ans=-ans; ///叉积相乘是有正负滴 ,需全部转化为正的!!!
in= ( ans- on+ 2 )/ 2;
printf("%d\n",in);
}
return 0;
}