Codeforces 799D Field expansion 暴力

来源:互联网 发布:mac退出全屏的快捷键 编辑:程序博客网 时间:2024/06/05 11:25

点击打开链接

题意:给出长宽A:(a,b),B:(h,w)和n个数a[i] 所有数<=1e5,操作:每次可以把h或者w乘以a[i],问矩形A能放入B的最少操作次数
a,b<=1e5 a[i]最小为2 则最多操作34次.每次两种决策2^34 显然TLE
由于选a[i]肯定是从大到小考虑 如果最后只剩下2,则直接分配2的个数即可,该操作复杂度为线性.
则最坏情况变为log(3,1e5)=11,O(2^22)=4e6 暴力即可 

#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll mod=1e9+7;const int N=2e5+20;int n,ans;ll A,B,h,w,a[N];//ll d[N],f[N];//d[i]:当长为i时的最大宽度 void dfs(ll h,ll w,int cur)//h,w为还差多少倍 {if(h==0&&w==0){ans=min(ans,cur-1);return;}if(cur>n||cur>34)return;if(a[cur]==2)//后面全部为2. {while(h)h/=2,cur++;while(w)w/=2,cur++;ans=min(ans,cur-1);return;}if(h)dfs(h/a[cur],w,cur+1);if(w)dfs(h,w/a[cur],cur+1);}int main(){//cout<<log(100000)/log(3)<<endl;while(cin>>A>>B>>h>>w>>n){for(int i=1;i<=n;i++)scanf("%I64d",&a[i]);sort(a+1,a+1+n);reverse(a+1,a+1+n);ans=n+1;dfs((A-1)/h,(B-1)/w,1);dfs((B-1)/h,(A-1)/w,1);//-1:相等就不需要在乘了 cout<<(ans==n+1?-1:ans)<<endl;}return 0;}


0 0
原创粉丝点击