HDU 5610 Baby Ming and Weight lifting

132 篇文章 0 订阅
61 篇文章 0 订阅
Problem Description

Baby Ming is fond of weight lifting. He has a barbell pole(the weight of which can be ignored) and two different kinds of barbell disks(the weight of which are respectively aa and bb), the amount of each one being infinite.

Baby Ming prepare to use this two kinds of barbell disks to make up a new one weighted CC(the barbell must be balanced), he want to know how to do it.

https://i-blog.csdnimg.cn/blog_migrate/b4b84567b13ee4486778964422b316b1.jpeg

Input

In the first line contains a single positive integer TT, indicating number of test case.

For each test case:

There are three positive integer a, ba,b, and CC.

1 \leq T \leq 1000, 0 < a, b, C \leq 1000, a \neq b1T1000,0<a,b,C1000,ab

Output

For each test case, if the barbell weighted CC can’t be made up, print Impossible.

Otherwise, print two numbers to indicating the numbers of aa and bb barbell disks are needed. (If there are more than one answer, print the answer with minimum a+ba+b)

Sample Input
2
1 2 6
1 4 5 
Sample Output
2 2

Impossible

简单枚举就可以了,我还傻乎乎的用了个背包。

#include<string>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<map>
#include<cmath>
using namespace std;
const int maxn = 1e5 + 10;
typedef long long LL;
int T, n, m;
int a, b, c, f[maxn];

int main()
{
    scanf("%d", &T);
    while (T--)
    {
        scanf("%d%d%d", &a, &b, &c);
        if ((c & 1) == 0)
        {
            c = c / 2;
            for (int i = 1; i <= c; i++) f[i] = -1;
            f[0] = 0;
            for (int i = 0; i <= c; i++)
            {
                if (f[i] >= 0)
                {
                    if (f[i + a] == -1) f[i + a] = f[i] + 1;
                    else f[i + a] = min(f[i + a], f[i] + 1);
                    if (f[i + b] == -1) f[i + b] = f[i] + 1;
                    else f[i + b] = min(f[i + b], f[i] + 1);
                }
            }
            if (f[c] >= 0) {
                for (int i = 0; i <= f[c]; i++)
                {
                    if (i*a + (f[c] - i)* b == c)
                    {
                        printf("%d %d\n", i*2, (f[c] - i)*2);    break;
                    }
                }
            }
            else printf("Impossible\n");
        }
        else printf("Impossible\n");
    }
    //while (scanf("%d", &n) != EOF){}
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值