本文主要是介绍AtCoder Regular Contest 172(仅A题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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;
}
这篇关于AtCoder Regular Contest 172(仅A题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!