https://ac.nowcoder.com/acm/contest/7852/E
技巧:枚举分母找分子,然后用上取整和下去整判断,不断减小误差,增加精度。
#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
typedef double db;
const db eps=1e-12;
inline db readb()
{
int f=1;db x=0;char s=getchar();
for( ;!isdigit(s);s=='-' && (f=-1),s=getchar());
for( ;isdigit(s);x=x*10+s-48,s=getchar());
if( s=='.' ) for( db l=0.1,s=getchar();isdigit(s);x=x+(s-48)*l,l/=10,s=getchar() );
return x*f;
}
int sgn( double d ) { return (d>eps)-(d<-eps); }; // 精度判断
struct node{
db l,r;
bool operator < ( const node &rhs )const{ return l<rhs.l; };
}p[maxn],tmp[maxn];
int n;
bool check( db x )
{
db now=0;
for( int i=1;i<=n;i++ )
{
if( p[i].r-x+eps<now ) return false;
now=max(p[i].l,now)+x;
}
return true;
}
int main()
{
n=readb();
db mins=1000000;
for( int i=1;i<=n;i++ )
{
p[i].l=readb(),p[i].r=readb();
mins=min(mins,p[i].r-p[i].l);
}
sort(p+1,p+1+n);
db ls=0,rs=mins;
while( rs-ls>=eps )
{
db mid=(ls+rs)/2;
if( check(mid) ) ls=mid;
else rs=mid;
}
db ep=1.0;
int mi=0,mu=0;
for( int i=1;i<=100000;i++ )
{
if( sgn(ls*i - (db)ceil(ls*i))==0 )
{
mi=ceil(ls*i);
mu=i;
ep=fabs( ls*i - (db)ceil(ls*i) );
}
if( sgn(ls*i - (db)floor(ls*i))==0 )
{
mi=floor(ls*i);
mu=i;
ep=fabs( ls*i - (db)floor(ls*i) );
}
}
cout<<mi<<"/"<<mu<<"\n";
}
京公网安备 11010502036488号