Divorce
题目描述:
题目讲述的是,Ignacio和Dolly两个人共同建了一所大学,然后某一天Ignacio和Dolly离婚了,然后他们要将这所大学进行划分,这所大学是一个边形,然后有
种划分,每种划分当中,Ignacio只能得到面积最小的区域,然后题目让我们求对于这
种划分当中,Ignacio最多能够得到面积最大区域的面积是多少。
题目分析:
首先,我们可以利用外积求出这个边形的面积,然后对于每种划分,再次利用外积求出划分后的两块区域的面积,记录
种划分当中Ignacio最多能够得到面积最大区域的面积即可。
代码:
#include <iostream>
#include <cstdio>
#include <stdio.h>
#include <cstdlib>
#include <stdlib.h>
#include <cmath>
#include <math.h>
#include <algorithm>
#include <cstring>
#include <string>
#include <string.h>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <bitset>
#include <deque>
#define reg register
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define eps 1e-3
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
#define lowbit(x) (x&(-x))
using namespace std;
const int Maxn=1e5+5;
const int Maxm=1e5+5;
double x[Maxn],y[Maxn],s[Maxn];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]);
for (int i=1;i<n;i++) s[i]=s[i-1]+0.5*(x[i]*y[i+1]-x[i+1]*y[i]);
double S=fabs(s[n-1]+0.5*(x[n]*y[1]-x[1]*y[n])),ans=0.;
while (m--)
{
int p,q;
scanf("%d%d",&p,&q);
if (p>q) swap(p,q);
double div=fabs(s[q-1]-s[p-1]+0.5*(x[q]*y[p]-x[p]*y[q]));
ans=max(ans,min(div,S-div));
}
printf("%0.6f\n",ans);
return 0;
}