51Nod 1110 距離之和最小 V3 三分

2021-08-07 06:05:56 字數 2034 閱讀 9671

分類:三分

[51nod 1110 距離之和最小 v3]

x軸上有n個點,每個點除了包括乙個位置資料x[i],還包括乙個權值w[i]。點p到點p[i]的帶權距離 = 實際距離 * p[i]的權值。求x軸上一點使它到這n個點的帶權距離之和最小,輸出這個最小的帶權距離之和。

input

第1行:點的數量n。(2 <= n <= 10000)

第2 - n + 1行:每行2個數,中間用空格分隔,分別是點的位置及權值。(-10^5 <= x[i] <= 10^5,1 <= w[i] <= 10^5)

output

輸出最小的帶權距離之和。

對所有的點按照座標位置排序。可以發現,帶權距離之和關於座標是先遞減後遞增的。那麼三分一下,就可以求出極值(最值)了。

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

typedef

long

double lb;

typedef

unsigned

int uint;

typedef

unsigned

long

long ull;

typedef pair pii;

typedef pairpll;

typedef pairplb;

typedef

vector

vi;

const

int inf = 0x3f3f3f3f;

const ll infl = 0x3f3f3f3f3f3f3f3fll;

const

long

double pi = acos(-1.0);

const

long

double eps = 1e-4;

void debug()

template

void debug (t f, r ...r)

template

inline

void umax(t &a, t b)

template

inline

void umin(t &a, t b)

template

inline

bool scan_d (t &ret)

template

void print(t x)

template

void println(t x)

template

t randintv(t a, t b) /*[a, b]*/

const

int maxn = 10005;

ll n;

struct node

} nd[maxn];

ll calc(ll x)

return sum;

}int main()

println(ans);

}#ifdef ___local_wonzy___

cout

<< "time elapsed: "

<< 1.0 * clock() / clocks_per_sec * 1000

<< " ms."

<< endl;

#endif // ___local_wonzy___

return

0;}

51nod 1110 距離之和最小 V3

1110 距離之和最小 v3 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 x軸上有n個點,每個點除了包括乙個位置資料x i 還包括乙個權值w i 點p到點p i 的帶權距離 實際距離 p i 的權值。求x軸上一點使它到這n個點的帶權距離之和最小,輸出這個最小的...

51 Nod 1110距離之和最小V3

1 秒131,072 kb 40 分 4 級題 x軸上有n個點,每個點除了包括乙個位置資料x i 還包括乙個權值w i 點p到點p i 的帶權距離 實際距離 p i 的權值。求x軸上一點使它到這n個點的帶權距離之和最小,輸出這個最小的帶權距離之和。收起第1行 點的數量n。2 n 10000 第2 n...

51nod 1096 距離之和最小

1096 距離之和最小 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 x軸上有n個點,求x軸上一點使它到這n個點的距離之和最小,輸出這個最小的距離之和。input 第1行 點的數量n。2 n 10000 第2 n 1行 點的位置。10 9 p i 10 9 ou...