比賽的時候並沒有做出這道題。。
於是在賽後決定更正一下
把度度熊和它的夥伴們當成黑點,所有的村莊當成紅點然後就可以了。。考慮對所有的黑點建圖
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 的數量最多能是多少。...