题面:有一块大小为H*W的巧克力,要分给n个人,第i个人要分边长为2^a[i]的正方形,问是否够分?
范围:H,W<=1E9; n<=1000; a[i]<=25
思路:贪心,关键是先处理大请求,并且要用大块来处理大请求。
- 将请求按从大到小依次处理,优先处理大请求,如果处理不了,则无解。
- 用大根堆维护剩余的巧克力大小,按短边从大到小的顺序弹出。
- 假设块大小为x*y,其中x<y,要划出边长为d的正方形,那么剩下两块矩形取(x1-d,y)与(d,y-d)更优。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a; i<=b; i++)
#define per(i,a,b) for(int i=b; i>=a; i--)
const int N = 1005;
int H, W, n, A[N];
void solve() {
cin >> H >> W >> n;
rep(i,1,n) cin >> A[i];
sort(A+1, A+1+n);
priority_queue<pair<int,int>> q;
if (H > W) swap(H, W);
q.push({H,W});
per(i,1,n) {
if (q.empty()) {
cout << "No\n";
return;
}
auto [x,y] = q.top(); q.pop();
int d = 1<<A[i];
if (x < d) {
cout << "No\n";
return;
}
q.push({min(x-d,y), max(x-d,y)});
q.push({min(d,y-d), max(d,y-d)});
}
cout << "Yes\n";
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
int t = 1;
while (t--) solve();
return 0;
}
标签:巧克力,请求,大到,int,arc127A,处理,rep
From: https://www.cnblogs.com/chenfy27/p/18062286