CQOI2012 組裝 (貪心)

2022-04-28 19:39:09 字數 1301 閱讀 7961

cqoi2012]組裝

博主並不會模擬退火,所以用了差分陣列加貪心嗎。我們先來看題:

在數軸上的某個位置修建乙個組裝車間

到組裝車間距離的平方的最小值。

1<=n<=20000

在一條直線上

距離的平方?(二次函式?)

1<=n<=10000?(nlogn(logn.....)?)

嗯?乍一看還真不知道怎麼做啊!

可是在x軸上?還要距離的平方,好像幾個二次函式加一起還是二次函式來著?

莫非?這整體就是乙個單峰函式?

好吧,零件種類有多種,但(既然是平方)應該還是要從二次函式出手吧。

既然每種物資只能選乙個的話那乾脆寫乙個分段函式吧。|xi|<=200000,他給的又是整形,分界點最多只有400000個,好像可行

貪心:它的範圍是-100000~100000,但如果我們將乙個零件看成乙個二次函式,數軸看成x軸,因為他們都是平方,每個零件所構成的函式都是 $ y=^2 $ 的形式(k表示零件在數軸上的位置)。

所以對於每一類零件,建立乙個座標軸,將零件畫成二次函式的形式,這樣對於每乙個x值,我們貪心的選y值最小的那個零件。這樣就能構成乙個分段函式,而我們將每一種類的零件所構成的分段函式放在一起(用差分陣列維護 $ y=ax^2+bx+c $ 中的b與c),幾個二次函式加一起還是二次函式,雖然分的段特別多,但絕對在我們的承受範圍內,然後我們用二次函式求最小值的公式把最小值求出來即可(最小值可以在段外!!!)

零件位置給的是整形,分段的點的小數部分絕對為0或0.5,我們在差分陣列前先處理一下(乘個二,加上200001,避免負數)(當然!你也可以用莫對思想維護!(比如鴿王發的那篇題解))

#include#include#include#define ll long long

#define db double

#define rg register int

using namespace std;

struct sut[200005];

int n,m,l,r;

ll s[800015];

ll v,k[800015];//請不要吝嗇您的long long和double

db a,b,c,res=(ll)1<<50,ans,tot;//res初值賦大些

inline bool cmp(su x,su y)

for(rg i=1;i<=800001;++i)printf("%.4lf",ans);

return 0;

}

CQOI2012 組裝 貪心

數軸上有 n 種點,總共有 m 個,每個點有它的座標 x i 和種類 p i 求乙個點,使得所有種類點中與這個點的最小距離的平方和最小。n le 10 4,m le 10 5,x i le 10 5 要最小化 sum n x x i 2 顯然在選定了每個種類使用的點以後,這是乙個關於 x 的二次函式...

題解 CQOI2012交換棋子

感受到網路流的強大了 這道題目的關鍵在於 前後顏色不變的,流入流出的次數相等 原本是黑色的最後變成了白色,流出比流入次數多1 原本是白色最後變成黑色,流入比流出次數多一。所以我們將每一點拆成3個點,分別代表流入點,原點與流出點。最開始為黑色的點與源點連流量為1,費用為0的邊,最後為黑色的點與匯點連流...

CQOI2012 交換棋子 費用流

有乙個n行m列的黑白棋盤,你每次可以交換兩個相鄰格仔 相鄰是指有公共邊或公共頂點 中的棋子,最終達到目標狀態。要求第i行第j列的格仔只能參與mi,j次交換。乙個點拆三份,入點,主點,出點 入點向主點連邊,主點向出點連邊,設該點允許的交換次數為 x 根據以下規則確定 s to 初態點,末態點 to t...