2023年百度之星初賽 1 F 矩形面積

2022-02-07 04:38:13 字數 3630 閱讀 2349

problem description

小度熊有乙個桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把這些矩形包圍起來的面積最小的矩形的面積是多少。

input

第一行乙個正整數 t,代表測試資料組數($1 \leq t \leq 20$),接下來 t 組測試資料。

每組測試資料佔若干行,第一行乙個正整數 $n(1 \leq n < \leq 1000)$,代表矩形的數量。接下來 n 行,每行 8 個整數$x_1, y_1, x_2, y_2, x_3, y_3, x_4, y_4$,代表矩形的四個點座標,座標絕對值不會超過10000。

output

對於每組測試資料,輸出兩行:

第一行輸出"case #i:",i 代表第 i 組測試資料。

第二行包含1 個數字,代表面積最小的矩形的面積,結果保留到整數字。

sample input22

5 10 5 8 3 10 3 8

8 8 8 6 7 8 7 6

10 0 2 2 2 0 0 2

sample output

case #1:

17case #2:

4mean:

analyse:

把n個矩形的點輸入多邊形尋找最小覆蓋面積矩形的模版**中就ok,網上套的模板。

time complexity: o(n)

source code:

/*

* this code is made by crazyacking

* verdict: accepted

* submission date: 2015-05-31-23.18

* time: 0ms

* memory: 137kb

*/#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define ull unsigned long long

using

namespace

std;

const

double eps = 1e-8

;const

int n = 4004

;int sign(double

d)struct

point

point

operator+(point d)

void read()

}ps[n];

intn, cn;

double

dist(point d1, point d2)

double

dist2(point d1, point d2)

bool

cmp(point d1, point d2)

//st1-->ed1叉乘st2-->ed2的值

double

xmul(point st1, point ed1, point st2, point ed2)

double

dmul(point st1, point ed1, point st2, point ed2)

//多邊形類

struct

poly

//加進乙個點

void

push(point tp)

//第k個位置

int trim(int

k)

void clear()

};//

返回含有n個點的點集ps的凸包

poly graham(point* ps, int

n)

return

ans;

}ans.push(ps[

0]);

ans.push(ps[

1]);

point* tps =ans.ps;

int top = -1

; tps[++top] = ps[0

]; tps[++top] = ps[1

];

for(int i = 2; i < n; i++)

int tmp = top; //

注意要賦值給tmp!

for(int i = n - 2; i >= 0; i--)

ans.pn =top;

return

ans;}//

求點p到st->ed的垂足,列引數方程

point getroot(point p, point st, point ed)

//next為直線(st,ed)上的點,返回next沿(st,ed)右手垂直方向延伸l之後的點

point change(point st, point ed, point next, double

l)//

求含n個點的點集ps的最小面積矩形,並把結果放在ds(ds為乙個長度是4的陣列即可,ds中的點是逆時針的)中,並返回這個最小面積。

double getminarearect(point* ps, int n, point*ds)

else

for(r=u=i = 0; i < cn; i++)

while(dmul(con[i], con[i+1

], con[i], con[r])

<= dmul(con[i], con[i+1], con[i], con[(r+1)%cn]))

while(dmul(con[i], con[i+1

], con[i], con[l])

>= dmul(con[i], con[i+1], con[i], con[(l+1)%cn]))

tmp = dmul(con[i], con[i+1], con[i], con[r]) - dmul(con[i], con[i+1

], con[i], con[l]);

tmp *= xmul(con[i], con[i+1

], con[i], con[u]);

tmp /= dist2(con[i], con[i+1

]); len = xmul(con[i], con[i+1], con[i], con[u])/dist(con[i], con[i+1

]);

if(sign(tmp - ans) < 0

) }}

return ans+eps;

}int

main()

struct point ds[4

];

double ans = getminarearect(ps,num*4

,ds);

printf(

"%.0lf\n

",ans);

}return0;

}

view code

2023年百度之星程式設計大賽 初賽 1

b problem description 小度熊拿到了乙個無序的陣列,對於這個陣列,小度熊想知道是否能找到乙個k 的區間,裡面的 k 個數字排完序後是連續的。現在小度熊增加題目難度,他不想知道是否有這樣的 k 的區間,而是想知道有幾個這樣的 k 的區間。input 輸入包含一組測試資料。第一行包含...

2015百度之星 初賽1 1002(rmq)

題目 小度熊拿到了乙個無序的陣列,對於這個陣列,小度熊想知道是否能找到乙個k 的區間,裡面的 k 個數字排完序後是連續的。現在小度熊增加題目難度,他不想知道是否有這樣的 k 的區間,而是想知道有幾個這樣的 k 的區間。input 輸入包含一組測試資料。第一行包含兩個整數n,m,n代表陣列中有多少個數...

百度之星 初賽B

a 傳送門 點我 求聯通塊個數,對於簡單圖而言,就是c v e,其中c就是聯通塊個數,v是頂點數,e是邊數 include include include include using namespace std const int max n 2e5 10 int n,m,k vectorg max...