解题思路:
这题就是求凸包面积,然后除以50就行了。不懂啥是凸包的可以去百度
求面积的话,选取凸包上的一个点作为基点,然后把多边形分成好多三角形,然后用叉积去算三角形面积就可以了。
#include<math.h>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef long long ll;
const int mx = 1e5 + 10;
int n,top,_x,_y;
struct node
{
int x,y;
}s[mx],tubeg[mx],w;
//在向量右侧值为负
int judge(node p1,node p2,node p0)//面积公式判断正负值
{
int ans = (p1.x-p0.x)*(p2.y-p0.y) - (p2.x-p0.x)*(p1.y-p0.y);
return ans;
}
bool cmp(node a,node b)
{
int c = judge(w,b,a);//极角排序,同角度按距离从小到大排
if(!c) return pow(a.x-w.x,2)+pow(a.y-w.y,2) < pow(b.x-w.x,2)+pow(b.y-w.y,2);
return c < 0;
}
void Graham()
{
tubeg[0] = s[0],tubeg[1] = s[1],tubeg[2] = s[2];
//0和1肯定是凸包上的点
top = 3;
for(int i=3;i<n;i++)
{
while(judge(tubeg[top-2],s[i],tubeg[top-1])>=0) top--;//在矢量左侧的点都去掉
tubeg[top++] = s[i];
}
}
int main()
{
while(~scanf("%d",&n))
{
int a,b,p = 0;
for(int i=0;i<n;i++){
scanf("%d%d",&s[i].x,&s[i].y);
if(s[i].y<s[p].y) p = i;
else if(s[i].y==s[p].y&&s[i].x<s[p].x) p = i;
}
if(n<=2){
puts("0.00");
continue;
}
swap(s[0],s[p]),w.x = s[0].x,w.y = s[0].y;
sort(s+1,s+n,cmp);//以最下左那个坐标为参考坐标做极角排序
Graham();
double ans = 0,x1,x2,y1,y2;
for(int i=1;i<top-1;i++)
{
x1 = tubeg[0].x - tubeg[i].x,y1 = tubeg[0].y - tubeg[i].y;
x2 = tubeg[0].x - tubeg[i+1].x,y2 = tubeg[0].y - tubeg[i+1].y;
ans += fabs(x1*y2-x2*y1)/2;//向量叉积求面积
}
printf("%d\n",int(ans/50));
}
return 0;
}