蓝桥2017省赛 分巧克力(二分)

分巧克力
在这里插入图片描述
在这里插入图片描述
分析:
一开始想到的是暴力枚举,枚举切割下来的巧克力的边长a,这时候要解决的问题就是一个长方形巧克力,最多能切出多少块正方形巧克力,即为(长方形的长/a)*(长方形的宽/a),不难看出,这个做法的复杂度高达10^10,TLE
二分优化,时间复杂度降为nlog2n
超时的暴力做法:

#include<bits/stdc++.h>
using namespace std;
struct node {
	int w;
	int h;
} a[100000 + 10];
int b[100000 + 10];
int main() {
	int n, k;
	int w, h;
	int maxx = 0;
	cin >> n >> k;
	for (int i = 1; i <= n; i++) {
		cin >> a[i].w >> a[i].h;
		if (a[i].w >=maxx) {
			maxx = a[i].w;
		}
		if (a[i].h >=maxx) {
			maxx=a[i].h;
		}
	}
//	cout<<maxx<<endl;
	int j = 1;
	int index = 0;
	while (j <= maxx) {
		int sum = 0;
		int m1;
		int m2;
		for (int i = 1; i <= n; i++) {
			if (j <= a[i].w && j <= a[i].h) {
				if (a[i].w >= a[i].h) {
					m1 = a[i].w; //大
					m2 = a[i].h;	//小
					int m3 = m2 / j;
					sum += (m1 / j) * m3;

				} else if (a[i].h >= a[i].w) {
					m1 = a[i].h;
					m2 = a[i].w;
					int m3 = m2 / j;
					sum += (m1 / j) * m3;
				}
			}
		}
		if (sum >= k) {
			b[index++] = j;
		}
		j++;
	}
	cout << b[index - 1] << endl;
}

二分:

#include<bits/stdc++.h>
using namespace std;
int n, k;
int h[100000 + 10];
int w[100000 + 10];
bool check(int mid) {
	int sum=0;
	for (int i = 0; i < n; i++) {
		 sum += (w[i] / mid) * (h[i] / mid);
	}
		if (sum >= k)
			return true;
		else return false;	
}
int main() {
	cin >> n >> k;
	int maxx = 0;
	for (int i = 0; i < n; i++) {
		cin >> w[i] >> h[i];
		if (w[i] >= maxx) {
			maxx = w[i];
		}
		if (h[i] >= maxx) {
			maxx = h[i];
		}
	}
	int l = 0;
	int r = maxx;
	while (l < r) {
		int mid = (l +r+1) / 2;
		bool flag = check(mid);
		if(flag)
		{
			l=mid;
		}
		else
		{
			r=mid-1;
		}
	}
	cout<<l<<endl;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值