簡要題意:
有一些要被圍起來的點,有一些木樁,請你以這些木樁為頂點構造乙個凸多邊形,使得要求的點全部在其內部,同時在原點處有乙個最高點,請你最小化以你選擇的凸多邊形為底面的椎體的側面積。
凸包dp sb題一道。
考場上沒看到凸多邊形的限制去想凹的情況了。
**:
#include
#define ll long long
#define re register
#define db double
#define cs const
using std::cerr;
using std::cout;
template
<
typename t>
void
ckmin
(t &a,cs t &b)
struct pnt
pnt(
int _x,
int _y):x
(_x),y
(_y)
friend pnt operator
+(cs pnt &a,cs pnt &b)
friend pnt operator
-(cs pnt &a,cs pnt &b)
friend ll operator
*(cs pnt &a,cs pnt &b)
inline db len
()cs};
inline ll crs
(cs pnt &a,cs pnt &b,cs pnt &c)
cs int n=
4e2+7;
int n,m;
ll fib[80]
,h;bool ok[n]
[n];
pnt p[n]
,q[n]
;int id[n]
[800
],ct[n]
;inline ll crs
(int a,
int b,
int c)
inline db dis
(int a,
int b)
inline db calc
(cs pnt &a,cs pnt &b)
inline db calc
(int a,
int b)
int ql[n]
,tl;
int qr[n]
,tr;
void
get_lr
(int o,
int t)
else}}
db f[n]
[n];
db calc
(int o));
for(
int t:ps)
db res=
1e16
;for
(int re i=o+
1;i<=n;
++i)
if(ok[i]
[o])
for(
int re j=o+
1;j<=n;
++j)
ckmin
(res,f[j]
[i]+
calc
(i,o));
return res;
}void
work()
);h=n+m>=75?
0:fib[n+m]
;for
(int re i=
1;i<=n;
++i)
for(
int re j=
1;j<=n;
++j)
for(
int re i=
1;i<=n;
++i));
std::
sort
(id+i+
1,id+n+1,
[i](
int a,
int b));
int&t=ct[i]=2
;for
(int re j=
3;j<=n;
++j)if(
crs(i,id[t]
,id[j])||
(id[t]
>i)
) id[
++t]
=id[j]
;for
(int re j=t+
1;j++j)id[j]
=id[j-t+1]
;}db ans=
1e16
;for
(int re i=
1;i<=n;
++i)
ans=std::
min(ans,
calc
(i));if
(ans<
1e16
)printf
("%.3lf\n"
,ans)
;else
puts
("no solution");
}void
main()
inline
void
file()
signed
main()
BJ模擬 帳篷 凸包
題目描述 解題思路 當n,m很小時,直接暴力列舉起點,用三角剖分的方式,狀態記錄當前點和上乙個點dp,複雜度為o n4 o n 4 當n,m較大時,h已經遠超1e9z,直接求周長最小凸包即可,注意周長最小時自動滿足凸性,所以可以只列舉起點,狀態記錄當前點dp即可,也可以用floyed求最小環的方式d...
校內模擬 最優得分(揹包DP)
第一檔資料暴力,第二檔資料因為沒有扣分限制所以就是乙個裸的01揹包。對於第三檔資料,因為有乙個b的限制,所以它選擇的做題順序會對得分產生影響。但因為b都是相同的,所以如果選好了要做哪些題目,顯然按照時間從小到大來做是最優的,排個序以後揹包就可以了。這些部分分基本上已經指明了正解的思路。仍然考慮選好要...
校內模擬 記憶(狀壓DP)
考場想到了正解,然後被卡快取記憶體,gg 乙個顯然的轉化就是設e ie i ei 表示朋友選擇第i ii個串的時候的期望操作次數。則答案就是所有e ie i ei 的平均值。首先考慮乙個o n l2l o nl2 l o nl2l 的暴力,對於每個串,列舉所有其他串看有多少個位置相同,則我們能夠知道...