OpenJudge 矩形分割 (二分查詢)

2021-07-23 15:17:40 字數 1624 閱讀 5708

03:矩形分割

總時間限制: 1000ms 記憶體限制: 65536kb

描述 平面上有乙個大矩形,其左下角座標(0,0),右上角座標(r,r)。大矩形內部包含一些小矩形,小矩形都平行於座標軸且互不重疊。所有矩形的頂點都是整點。要求畫一根平行於y軸的直線x=k(k是整數) ,使得這些小矩形落在直線左邊的面積必須大於等於落在右邊的面積,且兩邊面積之差最小。並且,要使得大矩形在直線左邊的的面積盡可能大。注意:若直線穿過乙個小矩形,將會把它切成兩個部分,分屬左右兩側。

輸入 第一行是整數r,表示大矩形的右上角座標是(r,r) (1 <= r <= 1,000,000)。

接下來的一行是整數n,表示一共有n個小矩形(0 < n <= 10000)。

再接下來有n 行。每行有4個整數,l,t, w 和 h, 表示有乙個小矩形的左上角座標是(l,t),寬度是w,高度是h (0<=l,t <= r, 0 < w,h <= r). 小矩形不會有位於大矩形之外的部分。

輸出 輸出整數n,表示答案應該是直線 x=n。 如果必要的話,x=r也可以是答案。

樣例輸入

1000

2 1 1 2 1

5 1 2 1

樣例輸出

5思路:二分查詢,初始l=0,r=r,取兩邊界中點,判斷改點符不符合條件,若左邊大於右邊,則說明更優解在改點左邊,反之則在左邊。需要注意的是題目有兩個條件,乙個是是兩邊之差最小,另乙個是令左邊的大矩形盡量的大。當二分查詢結束時,僅僅滿足第乙個條件,而第二個條件是不滿足的。所以當最後比較兩個最優解的時候,需要判斷兩個最優解的同時也要保證左邊的面積盡量大。一開始我想的是比較最優解絕對值大小的同時比較該最優解左邊的面積能否在不影響絕對值大小的情況下盡量大。但其實我這樣的思考是沒有必要的,因為其實當得出最終的l,r之後,只有兩種情況,一種是以l為界限的絕對值大小小於以r為界限,那麼答案便是l,否則就是r。第二種情況是當兩者一樣的時候,這時候要保證左邊大矩形面積盡量大,那麼便需要去r為界限,這樣答案更優於l。

還要注意變數要用long long。

**:

#include

#include

#include

using

namespace

std;

long

long l,r,mid;

long

long zuo,you,sum,ans,r,n;

struct node

ta[10010];

long

long love(long mid)

}return s1-s2;

}int main()

l=0;r=r;

while (l+1

2; sum=love(mid);

if (sum>0) r=mid;

else

if (sum<=0) l=mid;

else

if (sum==0)

}zuo=love(l);

you=love(r);

if (abs(zuo)>=abs(you)) ans=r;

else ans=l;

if (ans==maxx) ans=r;

printf("%lld",ans);

}

矩形分割(二分)

描述 平面上有乙個大矩形,其左下角座標 0,0 右上角座標 r,r 大矩形內部包含一些小矩形,小矩形都平行於座標軸且互不重疊。所有矩形的頂點都是整點。要求畫一根平行於y軸的直線x k k是整數 使得這些小矩形落在直線左邊的面積必須大於等於落在右邊的面積,且兩邊面積之差最小。並且,要使得大矩形在直線左...

題解 矩形分割(二分)

平面上有乙個大矩形,其左下角座標 0,0 右上角座標 r,r 大矩形內部包含一些小矩形,小矩形都平行於座標軸且互不重疊。所有矩形的頂點都是整點。要求畫一根平行於y軸的直線x k k是整數 使得這些小矩形落在直線左邊的面積必須大於等於落在右邊的面積,且兩邊面積之差最小。並且,要使得大矩形在直線左邊的的...

4136 矩形分割(二分查詢)

總時間限制 1000ms 記憶體限制 65536kb 描述平面上有乙個大矩形,其左下角座標 0,0 右上角座標 r,r 大矩形內部包含一些小矩形,小矩形都平行於座標軸且互不重疊。所有矩形的頂點都是整點。要求畫一根平行於y軸的直線x k k是整數 使得這些小矩形落在直線左邊的面積必須大於等於落在右邊的...