arc127A 分巧克力

题面:有一块大小为H*W的巧克力,要分给n个人,第i个人要分边长为2^a[i]的正方形,问是否够分?
范围:H,W<=1E9; n<=1000; a[i]<=25

思路:贪心,关键是先处理大请求,并且要用大块来处理大请求。

  1. 将请求按从大到小依次处理,优先处理大请求,如果处理不了,则无解。
  2. 用大根堆维护剩余的巧克力大小,按短边从大到小的顺序弹出。
  3. 假设块大小为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;
}
posted @ 2024-03-09 09:42  chenfy27  阅读(1)  评论(0编辑  收藏  举报