[NOI2012]骑行川藏

谁践踏了优雅 2021-12-23 15:01 269阅读 0赞

[NOI2012]骑行川藏

思路一:二分导数

http://www.cnblogs.com/RabbitHu/p/9019762.html

考虑“性价比”即花费单位能量缩短的时间。

如果我们给每一段随机分配一个速度,再调整

那么一定选择性价比最高的调整,或者把性价比较低的能量取回,再分配

而性价比随着能量分配,会越来越低

可以发现的是,最后所有的n段的性价比一定都相同!

(如果存在不同的,那么一定可以从性价比较低的收回一些能量,给性价比高的用,使得总时间更少)

由于实数范围,所以暴力模拟用个堆什么的不现实

考虑用数学方法:

每段的t-E图像是一个类反比函数

每个点的斜率就是当前能量的性价比!

就是$e_i$位置的导数

也即,最后的所有图像$e_i$的导数都是一样的!(并且都是负数)

而且可以发现,最后导数负数绝对值越小(导数越大),那么花费的总能量越多,时间越短

所以有二分的性质!

二分导数,考虑怎么检验

直观的想法是求出t-E的导数关于E的函数,,,没法求

但是,t和v的图像的导数就是y=si/x的导数可以求,E和v的导数根据关系式可以直接求

所以考虑通过v作为中介,求出t-E的导数关于v的函数

(看上面博客)然后就得到了式子,对于二分的导数,解方程求出$v_i$,再求出$e_i$,通过e的总和判断二分走向

至于解方程,就用二分即可。(由于等式一边是正数,所以一定有$v_i>v_i’$)

一些精度问题:(本题精度要求还是比较高的)

1.二分解方程判断的时候,能不用除法就不要用除法!但是不等式记得变号!(因为x小于零)

2.eps 1e-14(也可以不用eps,二分100次左右就结束(看人品。。。))

代码:

  1. #include<bits/stdc++.h>
  2. #define il inline
  3. #define reg register int
  4. #define numb (ch^'0')
  5. using namespace std;
  6. typedef long long ll;
  7. il void rd(int &x){
  8. char ch;bool fl=false;
  9. while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
  10. for(x=numb;isdigit(ch=getchar());x=x*10+numb);
  11. (fl==true)&&(x=-x);
  12. }
  13. namespace Miracle{
  14. const int N=1e4+4;
  15. const double eps=1e-14;
  16. double ans;
  17. double s[N],vi[N],k[N];
  18. int n;
  19. double eu;
  20. double jie(double x,int i){
  21. double l=max(vi[i],(double)0),r=100000.0;
  22. double ret=0.00;
  23. int cnt=60;
  24. while(r-l>eps){
  25. double mid=(l+r)/2;
  26. if(mid*mid*(mid-vi[i])*2*k[i]*x<=-1) r=mid;
  27. else l=mid;
  28. }
  29. ret=(l+r)/2;
  30. return ret;
  31. }
  32. double che(double mid){
  33. double sum=0;
  34. for(reg i=1;i<=n;++i){
  35. double v=jie(mid,i);
  36. sum+=k[i]*s[i]*(v-vi[i])*(v-vi[i]);
  37. }
  38. return sum;
  39. }
  40. int main(){
  41. rd(n);
  42. scanf("%lf",&eu);
  43. for(reg i=1;i<=n;++i){
  44. scanf("%lf%lf%lf",&s[i],&k[i],&vi[i]);
  45. }
  46. double r=0.0,l=-100000000.00;
  47. int cnt=100;
  48. while(r-l>eps){
  49. double mid=(l+r)/2.0;
  50. double now=che(mid);
  51. if(now<=eu) l=mid;
  52. else r=mid;
  53. }
  54. double mid=(l+r)/2.0;
  55. for(reg i=1;i<=n;++i){
  56. ans+=s[i]/jie(mid,i);
  57. }
  58. printf("%.10lf",ans);
  59. return 0;
  60. }
  61. }
  62. signed main(){
  63. Miracle::main();
  64. return 0;
  65. }
  66. /*
  67. Author: *Miracle*
  68. Date: 2019/2/5 11:36:13
  69. */

思路二:拉格朗日乘数法

咕咕咕

转载于:https://www.cnblogs.com/Miracevin/p/10352649.html

发表评论

表情:
评论列表 (有 0 条评论,269人围观)

还没有评论,来说两句吧...

相关阅读

    相关 【云旅游】西之

    这算是一次说走就走的旅行,没有太多的计划,就大概看了下路线和钱包,考虑跟团还是定制游。一顿对比后,最终还是选择定制游,没人拼车,最终谈下包车6天4500元,从成都出发往西走,最

    相关 驴找马

      今年到去年的互联网失业潮让我们在互联网行业的人也着实有点心惊胆战的。可能有很多大佬并没有这个感觉,但是对于一个刚踏入社会的新人,时时都可能被开的危险。不禁让我觉得永远不要把

    相关 2012黄金周湖北之1

        29日晚上还在处理紧急故障,3点多才回到家。早上5点多就醒了,于是收拾行李出发。     计划走广清-清连-凤宜高速,长沙过夜,10月1日走京珠-随岳-沪渝-襄荆高速

    相关 2012黄金周湖北之2

    进入湖南境内,车流又突然增大了。想加油了,一看路边的加油站,排了满满的一条长龙,估计没有一个小时排队肯定搞不定。于是当机立断下高速,进入郴州市区加油。 设了导航,很快找到一个