CQOI2012 組裝 貪心

2022-06-06 21:51:07 字數 904 閱讀 8954

數軸上有 \(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\) 的二次函式,其最小值為

\[\sum_^n x_i^2 - \frac 1 n \sum_^n x_i

\]於是現在我們只需要考慮如何選擇每個種類使用的點

對於同一種點按座標從小到大排序,每次列舉把某種點替換成他的下乙個

由於原式取得最小值的條件是 \(x= \frac 1 n \sum_^n x_i\)

我們將每次替換用乙個二元組 \((x_i,x_i')\) 表示,那麼我們只需要將所有二元組按照 \(x_i+x_i'\) 排序,就一定不會錯過最優解

#include using namespace std;

#define int long long

const int n = 100005;

int n,m,t1,t2,t3;

vector g[n];

struct pii ;

vector p;

double s,s2,ans=1e18,tans=0;

signed main()

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

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

for(int j=1;jbool);

ans=min(ans,s2-s*s/n);

tans=s/n;

for(int i=0;iprintf("%.4lf",tans);

}

CQOI2012 組裝 (貪心)

cqoi2012 組裝 博主並不會模擬退火,所以用了差分陣列加貪心嗎。我們先來看題 在數軸上的某個位置修建乙個組裝車間 到組裝車間距離的平方的最小值。1 n 20000 在一條直線上 距離的平方?二次函式?1 n 10000?nlogn logn.嗯?乍一看還真不知道怎麼做啊!可是在x軸上?還要距離...

題解 CQOI2012交換棋子

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

CQOI2012 交換棋子 費用流

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