分巧克力
分析:
一开始想到的是暴力枚举,枚举切割下来的巧克力的边长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;
}