分類:三分
[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...