洛谷 P1034 矩形覆盖
P1034 矩形覆蓋
題目描述
在平面上有nn個(gè)點(diǎn)(n \le 50n≤50),每個(gè)點(diǎn)用一對整數(shù)坐標(biāo)表示。例如:當(dāng)?n=4n=4?時(shí),44個(gè)點(diǎn)的坐標(biāo)分另為:p_1p1?(1,11,1),p_2p2?(2,22,2),p_3p3?(3,63,6),P_4P4?(0,70,7),見圖一。
這些點(diǎn)可以用kk個(gè)矩形(1 \le k \le 41≤k≤4)全部覆蓋,矩形的邊平行于坐標(biāo)軸。當(dāng)?k=2k=2?時(shí),可用如圖二的兩個(gè)矩形?s_1,s_2s1?,s2??覆蓋,s_1,s_2s1?,s2??面積和為44。問題是當(dāng)nn個(gè)點(diǎn)坐標(biāo)和kk給出后,怎樣才能使得覆蓋所有點(diǎn)的kk個(gè)矩形的面積之和為最小呢?
約定:覆蓋一個(gè)點(diǎn)的矩形面積為00;覆蓋平行于坐標(biāo)軸直線上點(diǎn)的矩形面積也為00。各個(gè)矩形必須完全分開(邊線與頂點(diǎn)也都不能重合)。
輸入輸出格式
輸入格式:?
n knk
x_1 y_1x1?y1?
x_2 y_2x2?y2?
... ...
x_n y_nxn?yn??(0 \le x_i,y_i \le 5000≤xi?,yi?≤500)
?
輸出格式:?
輸出至屏幕。格式為:
11個(gè)整數(shù),即滿足條件的最小的矩形面積之和。
?
輸入輸出樣例
輸入樣例#1:?復(fù)制 4 2 1 1 2 2 3 6 0 7 輸出樣例#1:?復(fù)制 4#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int x[51],y[51]; int n,k,val,ans=0x7f7f7f7f; struct nond{int l,r,u,d;bool flag; }v[5]; int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f; } bool jud(int i,int j){if(v[i].l<=v[j].l&&v[i].r>=v[j].l&&v[i].d>=v[j].d&&v[i].u<=v[j].d) return true;if(v[i].l<=v[j].r&&v[i].r>=v[j].r&&v[i].d>=v[j].d&&v[i].u<=v[j].d) return true;if(v[i].l<=v[j].l&&v[i].r>=v[j].l&&v[i].d>=v[j].u&&v[i].u<=v[j].u) return true;if(v[i].l<=v[j].r&&v[i].r>=v[j].r&&v[i].d>=v[j].u&&v[i].u<=v[j].u) return true;return false; } bool judge(){for(int i=1;i<=k;i++)if(v[i].flag)for(int j=1;j<i;j++)if(v[j].flag)if(jud(i,j)) return true;return false; } void dfs(int now){if(judge()) return ;val=0;for(int i=1;i<=k;i++)if(v[i].flag)val+=(v[i].r-v[i].l)*(v[i].d-v[i].u);if(val>ans) return ;if(now==n+1){ans=val;return ;}for(int i=1;i<=k;i++)if(!v[i].flag){v[i].l=y[now];v[i].r=y[now];v[i].u=x[now];v[i].d=x[now];v[i].flag=1;dfs(now+1);v[i].flag=0;}else if(v[i].flag){int a=v[i].l,b=v[i].r,c=v[i].u,d=v[i].d;v[i].l=min(v[i].l,y[now]);v[i].r=max(v[i].r,y[now]);v[i].u=min(v[i].u,x[now]);v[i].d=max(v[i].d,x[now]);dfs(now+1);v[i].l=a;v[i].r=b;v[i].u=c;v[i].d=d;} } int main(){n=read();k=read();for(int i=1;i<=n;i++)scanf("%d%d",&x[i],&y[i]);dfs(1);cout<<ans; }
?
?轉(zhuǎn)載于:https://www.cnblogs.com/cangT-Tlan/p/9911300.html
總結(jié)
以上是生活随笔為你收集整理的洛谷 P1034 矩形覆盖的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Annotation 的第一个工程
- 下一篇: 基于stm32f427实现SVPWM控制