输入样例:
2 10
6 5
5 6
输出样例:
2
这个题就是基础的二分问题,做题思路:
找到一个数,让其满足,所有小块的边值,且最终的总和要大于等于我们的K
第一次做错了!!
#include<iostream>
using namespace std;
#define x first
#define y second
const int N=1e5+10;
int n,k,Min=0x3f3f3f3f;
pair<int,int> a[N];
bool check(int t)
{
int cnt=0;
for(int i=1;i<=n;i++)
{
cnt+=(a[i].x/t)*(a[i].y/t);
}
if(cnt>=k) return true;
else return false;
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y;
Min=min(Min,min(a[i].x,a[i].y));
//我选择了最小值但忘记了一种情况
//假设k=2
//1 5
//10 10
//呢么如果我直接选了最小的1作为二分找边的右边界,呢么答案就是1,其实答案是5
}
int l=1,r=Min;
while(l<r)
{
int mid=l+r+1>>1;
if(check(mid))
{
l=mid;
}
else r=mid-1;
}
cout<<l;
return 0;
}
第二次AC
#include<iostream>
using namespace std;
#define x first
#define y second
const int N=1e5+10;
int n,k,Max=-1;
pair<int,int> a[N];
bool check(int t)
{
int cnt=0;
for(int i=1;i<=n;i++)
{
cnt+=(a[i].x/t)*(a[i].y/t);
}
if(cnt>=k) return true;
else return false;
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y;
Max=max(Max,max(a[i].x,a[i].y));//这里我将边界换成了最大值
}
int l=1,r=Max;
while(l<r)
{
int mid=l+r+1>>1;
if(check(mid))
{
l=mid;
}
else r=mid-1;
}
cout<<l;
return 0;
}