A - Chocolate
给N个人分巧克力,分的大小是2^Ai * 2^Ai,给你一个大小为H*W的巧克力,问能不能给N个人都分到要求的巧克力。
假设蓝色是h*w的大巧克力,红色的是要分出来的巧克力(四个角落都一样,这里用左上角)显然放角落会比放在中间或者其他地方带来更好的情况。
这里从最大的开始切,假设红色的就是最大的,那么把剩下的分成两块放回去用,不管是第一种还是第二种,都不会影响最终结果,因为能切出当前最大情况的只由第一种的绿色块决定,下面的第二种也把第一块绿色包含在内了。(如果从最小的开始切可能还要判断一下大小再选择情况)
#include <bits/stdc++.h>
#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define fr first
#define se second
#define endl '\n'
using namespace std;
const int N=1005;
int h,w,n,a[N],tmp=1;
map<int,int>two;
int cnt[N];
vector<pair<int,int>>v;
void solve(){
per(i,0,25)two[i]=tmp,tmp<<=1;
cin>>h>>w>>n;
per(i,1,n)cin>>tmp,cnt[tmp]++;
v.push_back({h,w});
rep(i,25,0){
while(cnt[i]){
bool flag=false;
per(j,0,v.size()-1){
if(v[j].fr>=two[i] and v[j].se>=two[i]){
flag=true;
cnt[i]--;
int h=v[j].fr,w=v[j].se;
v.push_back({h-two[i],two[i]});
v.push_back({h,w-two[i]});
v.erase(v.begin()+j);
break;
}
}
if(!flag)return cout<<"No"<<endl,void();
}
}
cout<<"Yes"<<endl;
}
signed main(){
ios::sync_with_stdio(false),cin.tie(nullptr);
int t=1;
while(t--)solve();
return 0;
}