叙述一个网站开发流程,网址大全查询,深圳企业注销,品牌创建策划方案正题
题目链接:https://www.luogu.com.cn/problem/P2179 题目大意
给出EEE和nnn个si,ki,uis_i,k_i,u_isi,ki,ui求一个序列viv_ivi满足 ∑i1nkisi(vi−ui)2≤E\sum_{i1}^nk_is_i(v_i-u_i)^2\leq Ei1∑nkisi(vi−ui)2≤E 的情况下最小化 ∑i1nsivi\sum_{i1}^…正题
题目链接:https://www.luogu.com.cn/problem/P2179 题目大意
给出EEE和nnn个si,ki,uis_i,k_i,u_isi,ki,ui求一个序列viv_ivi满足 ∑i1nkisi(vi−ui)2≤E\sum_{i1}^nk_is_i(v_i-u_i)^2\leq Ei1∑nkisi(vi−ui)2≤E 的情况下最小化 ∑i1nsivi\sum_{i1}^n\frac{s_i}{v_i}i1∑nvisi
1≤n≤1041\leq n\leq 10^41≤n≤104 解题思路
洛谷题解上一个十分神奇的做法看起来。主要是看不懂拉格朗日乘数法/kk
首先考虑对于段路的行驶时间tisivit_i\frac{s_i}{v_i}tivisi我们可以画出消耗的能量EEE和tit_iti的函数。
对于函数f(E)tif(E)t_if(E)ti不难发现的是在vi≥uiv_i\geq u_ivi≥ui的情况下EEE越小这个函数对应位置的导数越小。
也就是消耗单位能量减少的时间也就越少性价比就越低。而我们现在要给每段路分配一个tit_iti使得消耗能量和等于EEE且tit_iti和最小的话。
根据贪心的思想有选出若干个的tit_iti满足对应位置的导数相等。
那么我们就找到了所有路的共性考虑二分这个导数但是我们先对这个函数f(v)tEf(v)\frac{t}{E}f(v)Et求个导。
t′−svi2,E′2kisi(vi−ui)t-\frac{s}{v_i^2},E2k_is_i(v_i-u_i)t′−vi2s,E′2kisi(vi−ui) f′(v)t′E′−s2kisivi2(vi−ui)f(v)\frac{t}{E}-\frac{s}{2k_is_iv_i^2(v_i-u_i)}f′(v)E′t′−2kisivi2(vi−ui)s
然后我们二分出f′(vi)xf(v_i)xf′(vi)x然后再二分出对应的速度viv_ivi就好了。 code
#includecstdio
#includecstring
#includealgorithm
using namespace std;
const int N1e410;
int n;double E,s[N],k[N],v[N];
double getv(double x,int p){double lmax(v[p],0.0),r100000;for(int i1;i100;i){double V(lr)/2.0;if(-2.0*k[p]*V*V*x*(V-v[p])1.0)lV;else rV;}return (lr)/2.0;
}
double check(double x){double E0;for(int i1;in;i){double Vgetv(x,i);Ek[i]*s[i]*(V-v[i])*(V-v[i]);}return E;
}
int main()
{scanf(%d,n);scanf(%lf,E);for(int i1;in;i)scanf(%lf%lf%lf,s[i],k[i],v[i]);double l-1e5,r0;for(int i1;i100;i){double mid(lr)/2.0;if(check(mid)E)lmid;else rmid;}double mid(lr)/2.0,ans0;for(int i1;in;i)anss[i]/getv(mid,i);printf(%.12lf\n,ans);return 0;
}