yuri01 题解分享 · 2025/1/23
分巧克力(编程题) - 题解
```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
星河漫步vphyc 题解分享 · 2025/3/31
分巧克力(编程题) - 题解
``` #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
c754392814 题解分享 · 2024/4/8
分巧克力(编程题) - 题解
``` #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
lwj 题解分享 · 2024/4/7
分巧克力(编程题) - 题解
``` #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
xiaoxin 题解分享 · 2024/4/10
分巧克力(编程题) - 题解
``` #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
yayuqwq 题解分享 · 2024/4/6
分巧克力(编程题) - 题解
``` 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
LoneStarFallsIntoAdream 题解分享 · 2024/4/11
分巧克力(编程题) - 题解
``` #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
最后的路标 题解分享 · 2024/4/7
分巧克力(编程题) - 题解
``` #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
Heng_Xin 题解分享 · 2024/4/6
分巧克力(编程题) - 题解
```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
zhengzijie 题解分享 · 2024/4/5
分巧克力(编程题) - 题解
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