In this HackerEarthRatio - TIE BREAKER problem solution You are given N ratios in the form of A and B that is represented as A/B. The values of A and B are represented as double data type values. The values of B are incorrect. The actual values of B are B + R. You know the actual sum of all the ratios that is available in variable K.


HackerEarth Ratio - TIE BREAKER problem solution


HackerEarth Ratio - TIE BREAKER problem solution.

#include<bits/stdc++.h>
using namespace std;
#define ll long long int
ll n;
double c,t,lo,hi,mid,d[1005],s[1005];
int main()
{
freopen("samp.txt","r",stdin);
freopen("sout.txt","w",stdout);
ll i,j,k=0;
cin>>n;
lo=-1000000.0;
for(i=1;i<=n;i++)
{
cin>>d[i]>>s[i];
lo=max(lo,-1.0*s[i]);
}
cin>>t;
hi=10000000.0;
k=0;
while(k<=5000&&lo<=hi)
{
mid=(lo+hi)/2.0;
k++;
double cur=0.0;
for(i=1;i<=n;i++)
{
cur+=(d[i]/(s[i]+mid+0.0));
}
if(cur>=t)
lo=mid;
else
hi=mid;
}
cout<<fixed<<setprecision(8)<<mid;
return 0;
}

Second solution

#include<bits/stdc++.h>
#define eps 0.000001
using namespace std;
int n;
double a[1005],b[1005];
double f(double r)
{
double val=0.0;
for(int i=0;i<n;i++)
val+=a[i]/(b[i]+r);
return val;
}
int main()
{
int col;
cin>>n>>col;
assert(n>=1 && n<=1000);
assert(col==2);
double l=-2000.0,r=2000.0;
for(int i=0;i<n;i++)
{
cin>>a[i]>>b[i];
assert(a[i]>=1 && a[i]<=1000);
assert(abs(b[i])<=1000);
l=max(l,-1.0*b[i]);
}
double k,ans=0;l+=1e-7;
cin>>k;
assert(k>=1 && k<=1e6);
while(l<=r)
{
double mid=(l+r)/2.0;
double val=f(mid);
if(val>=k){ans=mid;l=mid+1e-7;}
else if(val<k) {r=mid-1e-7;}
}
cout<<fixed<<setprecision(7)<<ans<<"\n";
return 0;
}