暑假学校培训再一次做这个题;一开始还是以为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;
}