题意

给出\(s_i, k_i, v_i', E\),满足\(\sum_{i=1}^{n} k_i s_i ( v_i - v_i' )^2 \le E, v_i > v_i'\),最小化$ \sum_{i=1}^{n} \frac{s_i}{v_i} $

分析

首先是贪心,很显然小于等于号要取等号,即问题转化为,满足\(g(V) = \sum_{i=1}^{n} k_i s_i ( v_i - v_i' )^2 = E\),最小化$ f(V) = \sum_{i=1}^{n} \frac{s_i}{v_i}$。于是拉格朗日乘数大法好。

题解

拉格朗日乘数:

满足\(g(X) = c\),最大(小)化\(f(X)\),其中\(X\)是向量。

大概就是令\(F(X, \lambda) = f(X) + \lambda (g(X) - c)\),得到\(|X|+1\)个偏导为0的方程,答案就是所有解的其中一个。

对于本题:

$$
\begin{align}
F(V, \lambda)
& = f(V) + \lambda (g(V) - E) \\
& = \sum_{i=1}^{n} \left( \frac{s_i}{v_i} + \lambda k_i s_i ( v_i - v_i' )^2 \right) - \lambda E \\
& = \sum_{i=1}^{n} \left( \frac{s_i}{v_i} + \lambda k_i s_i v_i^2 + \lambda k_i s_i {v'}_i^2 - 2\lambda k_i s_i v'_i v_i \right) - \lambda E \\
\end{align}
$$

解出偏导方程,得到:

$$
2 \lambda k_i v_i^2 (v_i - v'_i) - 1 = 0
$$

由于\(v_i > v_i'\),所以对于答案的解来说,\(\lambda>0\)。而且还可以发现\(v_i\)关于\(\lambda\)单调,然后得到\((v_i - v ' _ i)\)关于\(\lambda\)单调。所以\(g(V)\)关于\(\lambda\)单调,于是我们可以二分一下\(\lambda\)。得到了\(\lambda\),求\(v_i\)也可以二分,或者牛顿迭代。

反思

1、数学太弱。

#include <bits/stdc++.h>
using namespace std;
typedef double lf;
const lf oo=1e9, eps=1e-12;
const int N=10005;
lf s[N], k[N], vv[N], v[N];
int n;
inline lf sqr(lf a) {
return a*a;
}
lf got(lf lambda) {
lf e=0;
for(int i=1; i<=n; ++i) {
lf l=0, r=oo, go=1/(lambda*k[i]*2);
while(r-l>=eps) {
lf mid=(l+r)/2;
if(sqr(mid)*(mid-vv[i])<=go) {
l=mid;
}
else {
r=mid;
}
}
v[i]=(l+r)/2;
e+=k[i]*s[i]*sqr(v[i]-vv[i]);
}
return e;
}
int main() {
lf E, l=0, r=oo;
scanf("%d%lf", &n, &E);
for(int i=1; i<=n; ++i) {
scanf("%lf%lf%lf", &s[i], &k[i], &vv[i]);
}
while(r-l>=eps) {
lf mid=(l+r)/2;
if(got(mid)<=E) {
r=mid;
}
else {
l=mid;
}
}
got((l+r)/2);
lf ans=0;
for(int i=1; i<=n; ++i) {
ans+=s[i]/v[i];
}
printf("%.9f\n", ans);
return 0;
}

【BZOJ】2876: [Noi2012]骑行川藏的更多相关文章

  1. bzoj 2876: [Noi2012]骑行川藏 拉格朗日数乘

    2876: [Noi2012]骑行川藏 Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1033  Solved: ...

  2. bzoj 2876: [Noi2012]骑行川藏【拉格朗日乘数法+二分】

    详见: http://blog.csdn.net/popoqqq/article/details/42366599 http://blog.csdn.net/whzzt/article/details ...

  3. 2876: [Noi2012]骑行川藏 - BZOJ

    Description 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因 ...

  4. bzoj2876 [Noi2012]骑行川藏

    Description 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因 ...

  5. bzoj2876 [NOI2012]骑行川藏(拉格朗日乘数法)

    题目描述 蛋蛋非常热衷于挑战自我,今年暑假他准备沿川藏线骑着自行车从成都前往拉萨.川藏线的沿途有着非常美丽的风景,但在这一路上也有着很多的艰难险阻,路况变化多端,而蛋蛋的体力十分有限,因此在每天的骑行 ...

  6. [BZOJ2876][NOI2012]骑行川藏(拉格朗日乘数法)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2876 分析:就是要求约束条件下函数的极值,于是拉格朗日乘数列方程,发现化简后的关于vi ...

  7. NOI2012 骑行川藏

    http://www.lydsy.com/JudgeOnline/problem.php?id=2876 表示完全不会...... 还是跪拜大神吧 http://www.cnblogs.com/Ger ...

  8. BZOJ2876 [Noi2012]骑行川藏 【拉格朗日乘数法】

    题目链接 BZOJ 题解 拉格朗日乘数法 拉格朗日乘数法用以求多元函数在约束下的极值 我们设多元函数\(f(x_1,x_2,x_3,\dots,x_n)\) 以及限制\(g(x_1,x_2,x_3,\ ...

  9. 【bzoj2876】 Noi2012—骑行川藏

    http://www.lydsy.com/JudgeOnline/problem.php?id=2876 (题目链接) 题意 在满足约束条件$${\sum_{i=1}^ns_ik_i(v_i-v_i' ...

随机推荐

  1. ListView优化中ViewHolder要不要定义为static静态内部类?

    给学生讲课的时候,发现存在这个问题,下来百度了下,发现很纠结,涉及到了内部类对外部类的引用,静态类的生命周期等java知识,现总结如下: static class ViewHolder { //定义l ...

  2. lucene/solr 修改评分规则方法总结

    说明:由于solr底层使用的是lucene,因此修改solr打分机制归根结底还是依赖于lucene的打分机制,本文主要讨论lucene的打分机制. 本文说明lucene 常用的四种影响评分结果的方式. ...

  3. 卸载Eclipse安装的插件

    背景:先前安装过Java Decompiler,不知道怎么弄的eclipse出问题之后不能用了,折腾了几次都没弄好,这次准备把这个插件先卸掉再装一次,结果发现,卸也卸不掉,最终是强制删除,以下为试过的 ...

  4. Java Server returned HTTP response code: 401

    今天写一个小功能需要通过http请求获取一些返回数据,但是在登陆时是需要进行用户名和密码的校验的.写好之后请求,返回异常Java Server returned HTTP response code: ...

  5. 接口JSon字符串格式

  6. TCP状态转换图详解

    以下对几个关键的中间状态进行说明: 三次握手: LISTEN:表示服务器的某个SOCKET处于监听状态,可以进行连接了. SYN_SENT:表示客户端的某个SOCKET与服务器进行connect时,首 ...

  7. loj 1036(dp)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25913 思路:易证存在一条从左上角到右下角的折线,沿着格子边缘的. ...

  8. 十天来学习java的心得体会

    有关学习java是几天来的心得体会: 十天学习java遇到很多问题,每个问题都是经过反复的看书本以及上网查找资料来解决的,发现这一点真的需要自己来而不是去遇到什么问题就去依靠他人(师兄.同学).在其中 ...

  9. github 使用网址

    [Github教程]史上最全github使用方法:github入门到精通 http://blog.csdn.net/hcbbt/article/details/11651229 githup的使用 h ...

  10. ps命令使用 进程查看

    ps命令是Process Status的缩写 用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命 ...