bzoj 2876骑行川藏
套拉格朗日乘子法
二分λ后二分速度
贴一个很难看的代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+100;
double s[N],k[N],u[N],v[N],eu,t;
double eps = 1e-14;
int n;
double pow2(double x){return x*x;}
bool check(double midd,double mid,int i){
if(midd*midd*(midd-u[i]) < 1/(mid*2*k[i])) return 1;
else return 0;
}
bool ok(double mid){
int i;
for(i = 1;i <= n;i ++) {
double l,r;
l = 0;r = 1e9+10;
while(l+eps<r){
double midd = (l+r)/2;
if(check(midd,mid,i)) l = midd;
else r = midd;
}
v[i] = l;
}
double ans = 0;
t = 0;
for(i = 1;i <= n;i ++){
ans += k[i]*pow2(v[i]-u[i])*s[i];
t += s[i]/v[i];
}
return ans > eu;
}
int main() {
cin>>n>>eu;
int i;
for(i = 1;i <= n;i ++)
cin>>s[i]>>k[i]>>u[i];
double l,r;
l = 0;r = 1e9+1000;
while(l + eps < r){
double mid = (l+r)/2;
if(ok(mid)) l = mid;
else r = mid;
}
ok(l);
printf("%.10f\n",t);
return 0;
}
[Jzoj5606]Yja