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