题解分享
题解分享简介
分巧克力(编程题) - 题解
```cpp
// https://dashoj.com/d/lqbproblem/p/45
#include <bits/stdc++.h>
#define N 100010
using namespace std;
typedef long long ll;
ll n, k, maxSide = 0;
vector<pair<ll, ll>> vpll(N);
bool check(ll len, ll k1) {
int count = 0; // 记录能切几个 len * len 大的蛋糕
for (auto &c: vpll) count += (c.first / len) * (c.second / len);
return count >= k;
}
int main() {
cin >> n >> k;
for (int i = 0; i < n; i++) {
cin >> vpll[i].first >> vpll[i].second;
maxSide = max({maxSide, vpll[i].first, vpll[i].second});
}
ll l = 0, r = maxSide;
while (l <= r) {
ll m = l + (r - l) / 2;
if (check(m, k)) l = m + 1;
else r = m - 1;
}
cout << r << endl;
return 0;
}
```
查看全文
0
0
1
1
分巧克力(编程题) - 题解
```
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,k;
int a[N],b[N];
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
}
int l=0,r=1e5;
while(l<r){
int mid=(l+r+1)/2;
long long sum=0;
for(int i=1;i<=n;i++){
sum+=(a[i]/mid)*(b[i]/mid);
}
if(sum>=k) l=mid;
else r=mid-1;
}
cout<<l<<endl;
}
```
查看全文
0
0
0
1
分巧克力(编程题) - 题解
```
#include<bits/stdc++.h>
using namespace std;
vector<pair<int,int>>cake;
int n,k;
bool check(int mid){
int sum = 0;
for(auto x : cake){
int a = x.first / mid;
int b = x.second / mid;
sum += a * b;
}
if(sum >= k) return true;
else return false;
}
int main(){
cin >> n >> k;
for(int i = 1; i <= n; i++){
int x,y; cin >> x >> y;
cake.push_back({x,y});
}
int l = 1 , r = 1e5;
while(l < r){
int mid = (l + r + 1) >> 1;
if(check(mid)) l = mid;
else r = mid - 1;
}
cout << l;
return 0;
}
```
查看全文
0
0
0
2
分巧克力(编程题) - 题解
```
#include<bits/stdc++.h>
using namespace std;
int a[100005],b[100005];
int l,r = 1e9,mid;
int n,k;
int check(int x)//检测分得的巧克力总数量
{
int c = 0;
for(int i = 1; i <= n; i++)
{
c += (a[i]/x)*(b[i]/x);
}
return c >= k;
}
int main()
{
cin >> n >> k;
for(int i = 1; i <= n; i ++)
{
cin >> a[i] >> b[i];
}
while(r - l > 1)
{
mid = (l+r) >> 1;
if(check(mid)) l = mid; // 如果切的数量大于人数, 则尽可能切大
else r = mid; // 如果切的数量少于人数,则切小
}
cout << l;
return 0;
}
```
查看全文
0
0
0
2
分巧克力(编程题) - 题解
```
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<string>
#include<vector>
using namespace std;
int n,k;
struct node{
int height;
int width;
};
vector<node> qcl;
bool check(int side){
int c=0;
for(int i=0;i<n;i++){
c+=(qcl[i].height/side) *(qcl[i].width/side);
}
return c>=k;
}
int main(){
cin>>n>>k;
int res=0;
// 处理输入数据
for(int i=0;i<n;i++){
node ever;
cin>>ever.height>>ever.width;
qcl.push_back(ever);
}
int l=0,r=1e9;
while(l<=r){
int mid=l+r>>1;
if(check(mid)){
res=mid;
l=mid+1;
}else{
r=mid-1;
}
}
cout<<res;
return 0;
}
```
查看全文
0
0
0
1
分巧克力(编程题) - 题解
```
def check(d):
global w,h
cnt = 0
for i in range(n):
cnt+=(w[i]//d)*(h[i]//d)
if cnt>=k:
return True
else:
return False
n,k = map(int,input().split())
h =[0]*(n+10)
w = [0]*(n+10)
for i in range(n):
h[i],w[i] = map(int,input().split())
l,r = 1,100000+10
while l<r:
mid = (l+r)//2
if check(mid):
l = mid+1
else:
r = mid
print(l-1)
```
查看全文
0
0
0
1
分巧克力(编程题) - 题解
```
#include<
using namespace std;
const int N=10e5+10;
int h[N],w[N];
int n,k;
bool check(int a){
int sum=0;
for(int i=0;i<n;i++){
sum+=(h[i]/a)*(w[i]/a);
if(sum>=k)return true;
}
return false;
}
int main(){
cin.tie(0)->sync_with_stdio(false);
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>h[i]>>w[i];
}
int l=1,r=10e5;
/*注意边界*/
while(l<r){
int mid=l+(r-l+1>>1);
if(check(mid))l=mid;
else r=mid-1;
}
cout<<r;
return 0;
}
```
查看全文
0
0
0
0
分巧克力(编程题) - 题解
```
#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
0
分巧克力(编程题) - 题解
```C++
#include <cstdio>
#include <vector>
using namespace std;
int main() {
int n, k;
scanf("%d %d", &n, &k);
vector<vector<int>> arr(n, vector<int>(2));
int maxn = 0; // 最大边长
for (int i = 0; i < n; ++i) {
scanf("%d %d", &arr[i][0], &arr[i][1]);
maxn = max(maxn, max(arr[i][0], arr[i][1]));
}
int l = 1, r = maxn;
while (l <= r) {
int mid = ((r - l) >> 1) + l; // 二分可能的边长
int tmp = 0;
for (int i = 0; i < n; ++i) {
tmp += (arr[i][0] / mid) * (arr[i][1] / mid);
}
if (tmp < k) { // 可分数量 < k => r 太大了
r = mid - 1;
} else {
l = mid + 1;
}
}
printf("%d\n", r);
return 0;
}
```
查看全文
0
0
0
0
分巧克力(编程题) - 题解
import sys
def check(mid):
res = 0
for i in range(N):
res += (H[i] // mid) (W[i] // mid)
if res >= K:
return True
return False
N,K = map(int,input().split())
H,W = [],[]
for i in range(N):
h,w = map(int,input().split())
H.append(h)
W.append(w)
l,r = 1, 10 5
while l
> 1
if check(mid):
l = mid
else:
r = mid - 1
print(l)
查看全文
0
0
0
0



