#include <bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int n;
int a[N],b[N];//分别为题目中的A B
bool check_min(int x)//判断最小值
{
for(int i=0;i<n;i++)
{
if(a[i]/x>b[i])//这个逻辑喜欢写反
return false;
}
return true;
}
bool check_max(int x)//判断最大值
{
for(int i=0;i<n;i++)
{
if(a[i]/x<b[i])//eg: 75/25=3 要的就是刚好大于得到b[I]的最大值(x) 再大就小于b[I]了 75/30<3
return false;
}
return true;
}
int main()
{
// 请在此输入您的代码
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i]>>b[i];
}
int l=1,r=1e9,min;
while(l<=r)//左边界 找最小值
{
int mid=(l+r)>>1;
if(check_min(mid))
{
min=mid;
r=mid-1;
}
else
l=mid+1;
}
l=1,r=1e9;//这里一定要重新初始化 l和r的值
int max;
while(l<r)//右边界 找最大值
{
int mid=(l+r+1)>>1;//注意这里的不同
if(check_max(mid))
{
max=mid;
l=mid;
}
else
{
r=mid-1;
}
}
cout<<min<<" "<<max;
return 0;
}
//y总的模板很好用 注意细节的修饰
冶炼金属 二分法 十四届蓝桥杯省赛真题B组
最新推荐文章于 2024-06-22 21:53:36 发布