bzoj1105 石頭花園

2022-06-07 13:18:10 字數 783 閱讀 8057

首先$c/2=x_+y_-x_-y_=max(x_,y_)-min(x_,y_)+min(x_,y_)-max(x_,y_)$,容易發現前兩項都是定值,那麼就是要最小化後面的數字

構造:讓所有數都滿足$x\le y$,那麼必然使得$min(x_,y_)$最小,$max(x_,y_)$最大,也就是令周長最小

然後考慮最小化重量和,根據上面的構造,我們發現必須要兩者同時取到極值才能最小,也就是可以分別構造,不妨列舉最大值的位置和次大值的位置(最小值同理),一共2*2=4種狀態分類討論即可

(注意:要判定無解,因為有可能某兩個不同型別(大和小)的值同時出現在乙個點中,導致兩種情況都不符合)

1 #include2

using

namespace

std;

3#define n 1000005

4int

n,mx1,mx2,mn1,mn2,ans,x[n],y[n],w[n];

5int calc(int mx1,int mx2,int mn1,int

mn2)

15swap(x[i],y[i]);16}

17return

ans;18}

19int

main()

30for(int i=0;i<2;i++)

35swap(mx1,mx2);36}

37 printf("

%lld %d

",2ll*(mx1+mx2-mn1-mn2),ans);

38 }

view code

bzoj1105 POI2007 石頭花園SKA

很顯然的結論,x,y 與 y,x 關於 y x 對稱 那麼就可以知道所有點一定是在直線的一側 暫時不考慮移動石子的代價 這樣得出來的就是最小的籬笆長度 有一些點可以不需要動,那麼第二問分四種情況討論即可 include include include includeusing namespace s...

BZOJ3229 石子合併

description 在乙個操場上擺放著一排n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分。input 第一行是乙個數n。以下n行每行乙個數a,表示石子數目。outpu...

bzoj 2597 石頭剪刀布

利用補集轉化建圖。可以得到ans c n,3 sigma c win i 2 具體的意思就是兩個勝場會破壞乙個三元環。之後展開,注意sigma win i n n 1 2,因為比賽場次是c n,2 個,因為寫成了n,一直wa include include include include inclu...