2017 WF e

暑假学校培训再一次做这个题;一开始还是以为c可以借解出来,但是困于 ∑di/(si+c)=t这个式子不知道如何解,就参考了一下博客,知道这道题用二分查找。

#include <iostream>
#include <stdio.h>
using namespace std;

int main()
{
  int n,t;
  double a[1005],b[1005];
  while(cin>>n>>t)
  {
      for(int i=0;i<n;i++)
        cin>>a[i]>>b[i];
        double left=-10000000,right=10000000,mid;
        while(right-left>0.0000001)//必须写到第7位
        {
            mid=(right+left)/2;
            double sum=0;//时间和
            for(int i=0;i<n;i++)
            {
                if(b[i]+mid<0)//速度小于零
                {
                    sum=10000000;
                    break;
                }
                sum+=a[i]/(b[i]+mid);
            }
            if(sum<t)
                right=mid;
            else if(sum>t)
                left=mid;
        }
        printf("%.7lf",mid);
  }
    return 0;
}

题目地址:https://cn.vjudge.net/contest/217089#problem/A

题目可以写成∑di/(si+c)=t的形式;c越小,分式整体值越大,解出c即可,但是题目没有给C的范围,所以自己给

/*对于di/(si+c)求和,由这个公式可以看到c越大,整体值就越小,所以用二分,如果tx<t说明x值大,应该小一点*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
int n,t;
double d[1050],s[1050];
bool check(double x)
{
    double tx=0;
    for(int i=0;i<n;i++)
    {
        double m=s[i]+x;
        if(m<=0)return false;
        tx+=d[i]/m;
    }
    if(tx<t)return true;
    return false;
}
int main()
{
    scanf("%d%d",&n,&t);
    for(int i=0;i<n;i++)
    {
        scanf("%lf%lf",&d[i],&s[i]);
    }
    double l=-2000000.0,r=2000000.0;

    while(l+1e-7<r)
    {
        double mid=(l+r)/2;
        //printf("%lf\n",mid);
        if(check(mid))r=mid;//tx<t
        else l=mid;
    }
    printf("%.9lf\n",l);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/guagua_de_xiaohai/article/details/79661944