百度之星度度熊保護村莊

2021-08-05 19:50:01 字數 1272 閱讀 7150

比賽的時候並沒有做出這道題。。

於是在賽後決定更正一下

把度度熊和它的夥伴們當成黑點,所有的村莊當成紅點

考慮對所有的黑點建圖

o(n²)暴力列舉所有的黑點點對,對於每個點對(a, b),o(n)檢測所有紅點

如果所有的紅點都在點對(a, b)(a->b)的右側,則a到b連線一條長度為1的單向邊

如果所有的紅點都在點對(a, b)(a->b)的左側,則b到a連線一條長度為1的單向邊

否則a和b不連邊

(注意三點共線的時候,如果c點在a和b的線段上直接連雙向邊,否則不連邊)

之後可以得到一張圖g

很好想到圖中最小的環就是最優方案,令road[a][b]為點a到點b的最短路

跑一邊floyd就好了,答案就是黑點個數m-min(road[i][i]) (1<=i<=m)

當然如果這個圖中都不存在環,那麼說明無法保護整個村莊,輸出tot

複雜度o(n^3),注意雖然n=500不過還有可能會超時。。優化下就好了

然後就可以了。。

至於怎麼判斷左右邊,就是乙個差積的問題啦。。

然後就沒有了

感覺很妙啊。。

一開始我是想對全部點建乙個凸包,然後跑。。

但我只yy到乙個盤tot的做法,至於點數,還真想不到

#include

#include

const

int n=505;

const

int max=1

<<28;

int n,m;

struct node;

node a[n],b[n];//住房 士兵

int f[n][n];

int mymin (int x,int y)

double mu (node a,node b,node c)

int main()

if (tf) f[u][i]=1;}}

for (int u=1;u<=m;u++)

for (int i=1;i<=m;i++)

int ans=max;

for (int u=1;u<=m;u++)

ans=mymin(ans,f[u][u]);

if (ans>m) printf("tot\n");

else

printf("%d\n",m-ans);

}return

0;}

話說可以在hdu做了

hdu 6080 度度熊保護村莊

嘩啦啦村襲擊了喵哈哈村!度度熊為了拯救喵哈哈村,帶著自己的夥伴去救援喵哈哈村去了!度度熊與夥伴們很快的就過來佔據了喵哈哈村的各個軍事要地,牢牢的守住了喵哈哈村。但是度度熊發現,這是一場曠日持久的戰鬥,所以度度熊決定要以逸待勞,儲存盡量多的體力,去迎戰嘩啦啦村的戰士。於是度度熊決定派盡量多的人去休息,...

百度之星小小粉絲度度熊

input 本題包含若干組測試資料。第一行兩個整數n,m,表示有n個區間,這n個區間內的天數,度度熊都簽到了 m表示m張補簽卡。接下來n行,每行兩個整數 l i r i 表示度度熊從第l i 天到第r i 天,都進行了簽到操作。資料範圍 1 n 100000 0 m 1000000000 0 l i...

2018百度之星(A)度度熊剪紙條

度度熊有一張紙條和一把剪刀。紙條上依次寫著 n 個數字,數字只可能是 0 或者 1 度度熊想在紙條上剪 k 刀 每一刀只能剪在數字和數字之間 這樣就形成了 k 1 段。他再把這 k 1 段按一定的順序重新拼起來。不同的剪和接的方案,可能會得到不同的結果。度度熊好奇的是,字首 1 的數量最多能是多少。...