CF799D:Field expansion(dp)

本文探讨了一个有趣的游戏场景扩展问题,玩家需要通过有限次数的扩展使游戏场地能够容纳特定大小的矩形区域。文章提供了一种高效的算法解决方案,并通过示例说明了如何实现这一目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

D. Field expansion
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

In one of the games Arkady is fond of the game process happens on a rectangular field. In the game process Arkady can buy extensions for his field, each extension enlarges one of the field sizes in a particular number of times. Formally, there are n extensions, the i-th of them multiplies the width or the length (by Arkady's choice) by ai. Each extension can't be used more than once, the extensions can be used in any order.

Now Arkady's field has size h × w. He wants to enlarge it so that it is possible to place a rectangle of size a × b on it (along the width or along the length, with sides parallel to the field sides). Find the minimum number of extensions needed to reach Arkady's goal.

Input

The first line contains five integers abhw and n (1 ≤ a, b, h, w, n ≤ 100 000) — the sizes of the rectangle needed to be placed, the initial sizes of the field and the number of available extensions.

The second line contains n integers a1, a2, ..., an (2 ≤ ai ≤ 100 000), where ai equals the integer a side multiplies by when the i-th extension is applied.

Output

Print the minimum number of extensions needed to reach Arkady's goal. If it is not possible to place the rectangle on the field with all extensions, print -1. If the rectangle can be placed on the initial field, print 0.

Examples
input
3 3 2 4 4
2 5 4 10
output
1
input
3 3 3 3 5
2 3 5 4 2
output
0
input
5 5 1 2 3
2 2 3
output
-1
input
3 4 1 1 3
2 3 2
output
3
Note

In the first example it is enough to use any of the extensions available. For example, we can enlarge h in 5 times using the second extension. Then h becomes equal 10 and it is now possible to place the rectangle on the field.


题意:给一个矩形a*b,和一个可扩展矩形h*w,从n个数里面任意分配若干个给h或w乘上,每个数只能使用一次,问最小使用多少个数这个矩形能装下a*b矩形。

思路:显然选择大的数有最优解,且最多需要34个数即可,因为2^17就超过题目范围的1e5了,那么对于数a[i],要么分配给h要么给w,用dp[i][j]表示处理前i个数h达到j长度时w的最大值。

//reference Dust_Heart
# include <bits/stdc++.h>
using namespace std;

typedef long long LL;
LL n, dp[38][100003], arr[100003];
int solve(LL a, LL b, LL h, LL w)
{
    int ans= -1;
    memset(dp, -1, sizeof(dp));
    dp[0][min(a,h)] = min(b, w);
    for(int i=1; i<=min(35,(int)n); ++i)
    {
        for(int j=1; j<=a; ++j)
        {
            if(dp[i-1][j]==-1) continue;
            LL nx = min(a, j*arr[i]);
            LL ny = min(b, dp[i-1][j]*arr[i]);
            dp[i][j] = max(dp[i][j], ny);
            dp[i][nx] = max(dp[i][nx], dp[i-1][j]);
        }
    }
    for(int i=1; i<36; ++i)
        if(dp[i][a]>=b)
        {
            ans = i;
            break;
        }
    return ans;
}
int main()
{
    LL a, b, h, w;
    while(~scanf("%I64d%I64d%I64d%I64d%I64d",&a,&b,&h,&w,&n))
    {
        for(int i=1; i<=n; ++i)
            scanf("%I64d",&arr[i]);
        if(h>=a&&w>=b || h>=b&&w>=a)
        {
            printf("0\n");
            continue;
        }
        sort(arr+1, arr+n+1,greater<LL>());
        int ans = min(solve(a, b, h, w), solve(a, b, w, h));
        if(ans == -1) puts("-1");
        else
            printf("%d\n",ans);
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值