代码及解析:
#include<bits/stdc++.h>
using namespace std;
int n,k;
const int N=100010;
int h[N],w[N];
bool check(int d){int num=0;for(int i=0;i<n;i++) num += (h[i]/d)*(w[i]/d);if(num>=k) return true; //够分else return false; //不够分
}
int main(){cin >> n >> k;for(int i=0;i<n;i++) cin>>h[i]>>w[i];int L=1, R=N; //D的初值是R=100010while(L<R) {int mid=(L+R)/2; if(check(mid)) L=mid+1; else R=mid; }cout << L-1; //需要减1 return 0;
}
#include<bits/stdc++.h>
using namespace std;
int len,n,m;
int stone[50005];
bool check(int d)
{int num=0;int pos=0;//当前用的石头 for(int i=1;i<=n;i++){if(stone[i]-pos<d)num++;//可以将他搬走else pos=stone[i];//换下一个石头考虑}if(num<=m)return true;else return false;
}
int main()
{cin>>len>>n>>m;for(int i=1;i<=n;i++){cin>>stone[i];}int L=0,R=len,mid;while(L<R){mid=(L+R)/2;if(check(mid))L=mid+1;else R=mid;}cout<<L-1;return 0;}