• 【codeforces 799D】Field expansion


    【题目链接】:http://codeforces.com/contest/799/problem/D

    【题意】

    给你长方形的两条边h,w;
    你每次可以从n个数字中选出一个数字x;
    然后把h或w乘上x;
    直到能够把一个长为a宽为b的长方形装下为止;
    问你最小的数字选择次数;

    【题解】

    把所给的n个数字从大到小排;
    显然同样是选一个数字,选大的数字肯定比较优;
    问题只是要让哪一条边乘上它;
    这里可以知道
    如果全都是2的话
    最多需要34个数字;
    因为log2(100000)≈17
    然后两条边都最多需要17个数字乘;
    所以是34个数字;
    但要给34个数字配的话;
    复杂度是2^34;这是不合适的;
    但是注意到;
    如果从某一位开始之后,都是2;
    那么就不存在分配问题了;
    即分配给谁都是一样的了,因为都是乘2了;
    而之前都是大于2的;也就是至少为3;
    而log3(100000)≈11
    也就是说等于2的数字所花费的时间可以近似忽略掉;
    直接while处理一下就好;
    而大于2的;最多22个;
    而2^22是可以接受的了,只有400W左右;
    写个dfs,从某一位开始如果变成2,后面就不再继续dfs,直接贪心能分配就分配;
    这里的dfs写成逆序的,即把乘的变成除的,这样写起来方便一点.

    【Number Of WA

    2

    【完整代码】

    #include <bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    #define ms(x,y) memset(x,y,sizeof x)
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    const int N = 1e5+100;
    
    int a,b,h,w,n,c[N],ans;
    
    void dfs(int a,int b,int num)
    {
        if (!a && !b)
        {
            ans = min(ans,num);
            return;
        }
        if (num>=n) return;
        if (c[num+1]==2)
        {
            while (a) a/=2,num++;
            while (b) b/=2,num++;
            ans = min(ans,num);
            return;
        }
        if (a) dfs(a/c[num+1],b,num+1);
        if (b) dfs(a,b/c[num+1],num+1);
    }
    
    int main()
    {
        //freopen("F:\\rush.txt","r",stdin);
        ios::sync_with_stdio(false),cin.tie(0);//scanf,puts,printf not use
        //init??????
        cin >> a >> b >> h >> w >> n;
        rep1(i,1,n)
            cin >> c[i];
        sort(c+1,c+1+n,[&](int a,int b){return a>b;});
        ans = n + 1;
        dfs((a-1)/h,(b-1)/w,0);
        dfs((b-1)/h,(a-1)/w,0);
        cout << (ans==n+1?-1:ans)<<endl;
        return 0;
    }
  • 相关阅读:
    jquery学习以及下载链接
    iOS:进度条控件的详细使用
    iOS: 工具栏控件UIToolBar和工具栏按钮控件UIBarButtonItem的使用
    iOS:分段控件UISegmentedControl的详细使用
    iOS:分页控件UIPageControl的使用
    iOS:提示框(警告框)控件UIActionSheet的详解
    iOS:风火轮活动刷新视图控件UIActivityIndicatorView的详细使用
    iOS:UIPageViewController翻页控制器控件详细介绍
    iOS:提示框(警告框)控件UIAlertView的详解
    iOS:网络编程的第三方框架:AFNetworking、SDWebImage
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626323.html
Copyright © 2020-2023  润新知