uva 1331——Minimax Triangulation
生活随笔
收集整理的這篇文章主要介紹了
uva 1331——Minimax Triangulation
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:三角刨分,把一個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());} }創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的uva 1331——Minimax Triangulation的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uva 1625——Color Leng
- 下一篇: 至尊红颜剧情介绍