• 7-27 Codeforces Round #499 (Div. 2)


    C. Fly

    链接:http://codeforces.com/group/1EzrFFyOc0/contest/1011/problem/C

    题型:binary search 、math。

    题意:总共有n个星球,飞船从地球起飞经过n-2个星球(在每个星球上做降落、起飞的动作)到达火星,在火星上同样降落起飞,然后直接返回地球做降落。每个星球起飞所需的燃料质量为ai,降落所需要的燃料质量为bi。飞船本身载重为m,附加燃料质量为所求值。问至少需要多少质量的燃料使得地球能做完整的往返运动,精度为1e-6。

    题解:可以用二分也可以不用二分,做这道题之前还不会二分精度,太懒了啥都没学。不用二分就是从回到地球往前推,抓住此时的飞船质量是m。

    式子就是 ans=ans*c[i]*1.0/(c[i]-1),c[i]存的是起飞降落的燃料,起飞和降落间隔着存。c[i]<=-1则无解。

    二分精度就拿同学的代码看了一下。

    /*math*/
    #include <iostream> #include <string.h> #include <algorithm> #include <stdio.h> #include <string> #include <map> #include <vector> #include <cmath> #include <set> #define ll long long #define PI 3.1415926535 #define AC ios::sync_with_stdio(0) using namespace std; const int inf=1010; /*bool cmp(const vector<pair<int,int> >& a,const vector<pair<int,int> >& b) { return a.second<b.second; }*/ //map<int,int>mp; //vector<pair<int,int> >vec; //map<int,int>mp2; double a[inf]; double b[inf]; double c[3000]; int main() { ios::sync_with_stdio(0); ll n,m; cin>>n; cin>>m; for(int i=1;i<=n;i++) { cin>>a[i]; //a[i]*=1e10; } for(int i=1;i<=n;i++) { cin>>b[i]; //b[i]*=1e10; } int t=0; for(int i=1;i<n;i++) { c[++t]=a[i]; c[++t]=b[i+1]; } c[++t]=a[n]; c[++t]=b[1]; double ans=m; for(int i=t;i>=1;i--) { if(c[i]<=1) { cout<<-1; return 0; } ans=ans*c[i]*1.0/(c[i]-1); } printf("%.8f",ans-m); }
    /*binary search*/
    #include<cstdio>
    double a[1010];
    double b[1010];
    int main(void)
    {
        int n;
        double m;
        scanf("%d%lf
    ",&n,&m);
        for(int i=0;i<n;i++)
            scanf("%lf",&a[i]);
        for(int i=0;i<n;i++)
            scanf("%lf",&b[i]);
        double l=0,r=1e9+10;
        while(r-l>=0.0000001&&l<=1e9)  // Attention
        {
            double mid=(r+l)/2;
            double sum=m+mid;
            double k=0,t=0;
            int x=0,y=1;
            while(1)
            {
                sum-=sum/a[x];
                sum-=sum/b[y];
                if(x==n-1)
                {
                    break;
                }
                x++;
                y++;
                if(y==n)
                    y=0;
            }
            if(sum>m)
                r=mid;
            else if(sum<m)
                l=mid;
            else
            {
                r=mid;   //  l 或者 r
                break;
            }
        }
        if(l>1e9)
            printf("-1
    ");
        else
            printf("%f
    ",r); // l 或者 r 或者 mid
        return 0;
    }
  • 相关阅读:
    Sys 模块
    Select,poll,epoll复用
    Urllib模块
    多线程模块
    设计模式四:观察者,模板方法,命令,状态,职责链条,解释器,中介者,访问者,策略,备忘录,迭代器
    设计模式三:适配器,桥接,组合,装饰,外观,享元,代理
    设计模式二:建造者,原型,单例
    【Unix 网络编程】TCP状态转换图详解(转)
    Mysql系列:MySql 数据库设计与基本使用
    lombok builder源码解读
  • 原文地址:https://www.cnblogs.com/LLbinGG/p/9377045.html
Copyright © 2020-2023  润新知