题意:三角刨分,把一个m边形分解成m-2个三角形,求一个最大三角形最小的刨分,输出最小的那个三角形面积。
思路:递推。可能需要一点几何思维,d(i,j)为多边形的最优解,则d(i,j)=min(s(i,j,k),d(i,k),d(k,j));s(i,j,k)是三角形i-j-k的面积。然后枚举i,j,k求出最优即可。
code:
#include <bits/stdc++.h>
using namespace std;#define ft(i,s,t) for (int i=s;i<=t;i++)
const int INF=0x3f3f3f3f;
const int N=55;
const double ep=1e-6;
struct node
{double x,y;
}v[N];
int n;
double dp[N][N];
double area (node A,node B,node C)
{return 0.5*fabs((B.x-A.x)*(C.y-A.y)-(C.x-A.x)*(B.y-A.y));
}int ok(int a,int b,int c)
{double t=area(v[a],v[b],v[c]);ft(i,0,n-1){if (i==a||i==b||i==c) continue;double sum=(area(v[a],v[b],v[i])+area(v[a],v[i],v[c])+area(v[i],v[b],v[c]));if (fabs(sum-t)<ep) return 0;}return 1;
}
double sol()
{double ans=INF;ft(i,2,n-1) ft(j,0,n-1){int r=(i+j)%n;dp[j][r]=INF;for(int k=(j+1)%n;k!=r;k=(k+1)%n){if (ok(j,k,r))dp[j][r]=min(dp[j][r],max(max(dp[j][k],dp[k][r]),area(v[j],v[k],v[r])));}if (i==n-1)ans=min(ans,dp[j][r]);}return ans;
}
int main()
{int T;scanf("%d",&T);while (T--){scanf("%d",&n);ft(i,0,n-1) scanf("%lf %lf",&v[i].x,&v[i].y);printf("%.1f\n",sol());}
}