二分查找(基础)
竞赛中心 - 蓝桥云课
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
#define int long long
int N;
struct NO
{int A,B;
}a[10001];
bool ok(int V)
{for (int i = 0; i < N; ++i){if (a[i].A / V != a[i].B){return false;}}return true;
}
signed main()
{// 请在此输入您的代码cin>>N;for(int i=0;i<N;i++){cin>>a[i].A>>a[i].B;}int L=1; int R=1e9;for(int i=0;i<N;i++){L=max(L,a[i].A/(a[i].B+1)+1);}for(int i=0;i<N;i++){R=min(R,a[i].A/a[i].B);}int l=L;int r=R;int result1=l;int result2=r;while(l<=r){int mid=(l+r)/2;if(ok(mid)){result1=mid;r=mid-1;}else{l=mid+1;}}cout<<result1<<" ";l=L;r=R;while(l<=r){int mid=(l+r)/2;if(ok(mid)){result2=mid;l=mid+1;}else{r=mid-1;}}cout<<result2;return 0;
}
通过数学知识不难想出V的最大值与最小值在一定的范围内,找出这个范围再用二分查找的方法找到最大值与最小值。
定义判断函数,判断得到的值是否符合题目要求:
bool ok(int V)
{for (int i = 0; i < N; ++i){if (a[i].A / V != a[i].B){return false;}}return true;
}
将范围内的中间值作为结果,在确定最小值时,如果在中间值符合题目要求,就要在左边界到中间值这个范围内进行搜索。反之,则在另一个范围内搜索。在确定最小值时则正好相反。