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",&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\n");
    else
        printf("%f\n",r); // l 或者 r 或者 mid
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/LLbinGG/p/9377045.html