返回题解分享
讨论 / 题解分享/ 帖子详情

分巧克力(编程题) - 题解

#include
#define objl '\n'
typedef long long ll;
using namespace std;
//数据结构在这里定义

const int N = 1e5 + 10;
int n,k; 
int H[N];
int W[N];//第i块巧克力的数据
int maxn = 0;//最大的一块巧克力边长,它作为初始的r 

bool check(ll x){
	int sum = 0;
	for(int i = 1; i<=n;i++){
		//逐个切巧克力
		sum = sum + (H[i]/x)*(W[i]/x); 
	}
	if(sum >= k){
		return true;
	}else{
		return false;
	}
	
}

//要找边长的最大值也就是右边界 
void bs(){
	ll l = 1, r = maxn;
	ll ans = 1;
	while(l<=r){
		//左闭右闭
		ll mid = l + (r - l) / 2;
		//排除 [mid, right] 
		if(check(mid)==false){
			//说明边长太大,块数不够给小朋友 
			//mid以及mid以后的边长一定不满足条件 
			r = mid - 1; 
		//mid是解区间内的一个值 
		}else if(check(mid)==true){//满足条件就记录一个答案,直到找不到为止 
			//可能Mid就是我要找的最大值 当l=mid+1后
			//l-r之间再也找不到了 
			ans = mid;
			l = mid + 1;
		}
	}
	cout << ans << endl; 
}


void solve(){

	cin >> n >> k;
	for(int i =1;i <= n;i++){
		cin >> H[i] >> W[i];
		if(H[i] > maxn){
			maxn = H[i];//作为r值 
		}
		if(W[i] > maxn){
			maxn = W[i];
		}
	}
	
	bs();
	
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;//多组数据要cin
	//cin >> t;
	t = 1;
	while(t--){
		solve();
	} 
	return 0;//必须加return 0 
}
0 回复 0 转发 0 喜欢 5 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!