[BZOJ2876][Noi2012]骑行川藏 && 二分+拉格朗日乘数

来源:互联网 发布:效果图快速制作软件 编辑:程序博客网 时间:2024/04/27 22:14

我智商不足 无法解释清楚这些东西

大爷题解传送门:http://blog.csdn.net/popoqqq/article/details/42366599

另一篇很不错的:http://www.cppblog.com/prime56/archive/2012/08/13/187087.aspx

大概就是lambda和vi是单调的然后二分一下

#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#include<queue>#define SF scanf#define PF printfusing namespace std;typedef long long LL;const int MAXN = 10000;const double eps = 1e-12;double x[MAXN+10], k[MAXN+10], s[MAXN+10], v[MAXN+10];double E;int n;double check(double lambda) {double ret = 0;for(int i = 1; i <= n; i++) {double l = max(0.0, v[i]), r = 123456789;while(r-l > eps) {double mid = (l+r) / 2;if(2 * lambda * k[i] * mid * mid * (mid - v[i]) > 1) r = mid;else l = mid;}x[i] = l;ret += s[i] * k[i] * (x[i]-v[i]) * (x[i]-v[i]);}return ret;}void solve() {double l = 0, r = 123456789;while(r-l > eps) {double mid = (l+r) / 2;if(check(mid) > E) l = mid;else r = mid;}}int main() {SF("%d%lf", &n, &E);for(int i = 1; i <= n; i++) SF("%lf%lf%lf", &s[i], &k[i], &v[i]);solve();double ans = 0;for(int i = 1; i <= n; i++)ans += s[i] / x[i];PF("%.8f", ans);}


0 0
原创粉丝点击