arc127A 分巧克力

chenfy27發表於2024-03-09

題面:有一塊大小為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;
}

相關文章