【备战秋招】每日一题:2022.11.5-华为机试-桃子礼包

为了更好的阅读体检,可以查看我的算法学习网
本题在线评测链接:P1032

题目内容

塔子哥是一个来自桃花村的年轻人,他从小就喜欢吃桃子。

今年桃子丰收,他想买一些桃子存放起来,以备过冬之用。他听说附近有一个卖桃子的商家,提供两种不同的桃子礼包。

塔子哥很感兴趣,于是他前往商家那里看看。商家告诉他,第一种礼包包含 b b b 个桃子,售价为 a a a 元,第二种礼包包含 d d d 个桃子,售价为 c c c 元。

每个礼包可以买任意次,但只能选择一种礼包购买。

塔子哥需要购买至少 k k k 个桃子,他希望只购买礼包 1 1 1 的花费比只购买礼包 2 2 2 的花费要小。

你能帮塔子哥求出这个 k k k 吗?

输入描述

第一行输入一个正整数 t t t ,代表询问的次数。

接下来的 t t t 行,每行输入四个正整数 a a a b b b c c c d d d ,用空格隔开。

1 ≤ t ≤ 1 0 3 1\le t\le 10^3 1t103

1 ≤ a , b , c , d ≤ 1 0 9 1\le a,b,c,d\le 10^9 1a,b,c,d109

输出描述

对于每行询问,输出一个合法的正整数 k k k 0 < k < 2 31 0 \lt k \lt 2^{31} 0<k<231 ), 代表买桃子的数量。

有多解时输出任意即可。如果无解则直接输出 − 1 -1 1

样例

输入

3
1 2 3 4
4 3 3 4
5 3 4 5

输出

2
-1
-1

题目思路

首先明白塔子哥的决策:

  • a a a b b b
  • c c c d d d

然后我们分类讨论:

  • a < c a<c a<c
    • b < d b<d b<d:我们直接买 b b b个桃子,就行
    • b > d b>d b>d:我们也买 b b b个桃子,因为 a < c a<c a<c b > d b>d b>d属于物美价廉
  • a = c a=c a=c
    • b > d b>d b>d:我们买 b b b个桃子,此时我们只要花 a a a块钱,而使用第二个礼包则至少花 2 a 2a 2a
    • b < = d b<=d b<=d:我们买不了,输出 − 1 -1 1。上一个的情况反过来就可以
  • a > c a>c a>c
    • b < = d b<=d b<=d:买不了,输出 − 1 -1 1。这和 a < c a<c a<c b > d b>d b>d的情况反过来
    • b > d b>d b>d:我们假设买 b b b个,那么第二个礼包需要花费 c e i l ( b / d ) ∗ c ceil(b/d)*c ceil(b/d)c元。第一个礼包花费 a a a
      • c e i l ( b / d ) ∗ c < = a ceil(b/d)*c<=a ceil(b/d)c<=a,买不了,输出 − 1 -1 1.我们买 b b b个,人家买第二个礼包更优惠,买大于 b b b个也一样。小于 b b b个也一样
      • c e i l ( b / d ) ∗ c > a ceil(b/d)*c>a ceil(b/d)c>a,买 b b b个就可以。

代码

Pyhon代码

t = int(input())
for TT in range(t):
    a,b,c,d = map(int, input().split())
    if a < c:
        print(b)
    elif a == c:
        print(b if b > d else -1)
    else:
        if b <= d:
            print(-1)
        else:
            print(b if (b + d - 1) // d * c > a else -1)

C++代码

#include <iostream>
using namespace std;

int main(){
	int t;
	cin>>t;
	while(t--){
		int a,b,c,d;
		cin>>a>>b>>c>>d;
		if (a<c)
			cout<<b<<endl;
		else if (a==c)
		{
			if (b>d)
				cout<<b<<endl;
			else
				cout<< -1<<endl;
		}
		else
		{
			if (b<=d)
				cout<< -1<<endl;
			else if((b+d-1)/d*c>a)
				cout<<b<<endl;
			else
				cout<< -1<<endl;
		}
	}
}

Js代码

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';

process.stdin.on('data', (data) => {
	input += data;
	return;
});
process.stdin.on('end', () => {
    input=input.split('\n');
    var t=Number(input[0]);
    for (let i=1;i<=t;i++){
        var a=Number(input[i].split(' ')[0]);
        var b=Number(input[i].split(' ')[1]);
        var c=Number(input[i].split(' ')[2]);
        var d=Number(input[i].split(' ')[3]);
        if (a<c)
			console.log(b);
		else if (a==c)
		{
			if (b>d)
				console.log(b);
			else
				console.log(-1);
		}
		else
		{
			if (b<=d)
				console.log(-1);
			else if((b+d-1)/d*c>a)
				console.log(b);
			else
				console.log(-1);
		}
    }
    
})

Java代码

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int t = scanner.nextInt();
        while (t-- != 0) {
            int a, b, c, d;
            a = scanner.nextInt();
            b = scanner.nextInt();
            c = scanner.nextInt();
            d = scanner.nextInt();
            if (a < c)
                System.out.println(b);
            else if (a == c) {
                if (b > d)
                    System.out.println(b);
                else
                    System.out.println(-1);
            } else {
                if (b <= d)
                    System.out.println(-1);
                else if ((b + d - 1) / d * c > a)
                    System.out.println(b);
                else
                    System.out.println(-1);
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

塔子哥学算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值