#P1032. 第2题-桃子礼包
          
                        
                                    
                      
        
              - 
          
          
                      1000ms
            
          
                      Tried: 286
            Accepted: 74
            Difficulty: 4
            
          
          
          
                       所属公司 : 
                              阿里
                                
            
                        
              时间 :2022年11月5日-淘天
                              
                      
          
 
- 
                        算法标签>数学          
 
第2题-桃子礼包
题目思路
首先明白塔子哥的决策:
- a元b桃
 - c元d桃
 
然后我们分类讨论:
- a<c
- b<d:我们直接买b个桃子,就行
 - b>d:我们也买b个桃子,因为a<c且b>d属于物美价廉
 
 - a=c
- b>d:我们买b个桃子,此时我们只要花a块钱,而使用第二个礼包则至少花2a。
 - b<=d:我们买不了,输出−1。上一个的情况反过来就可以
 
 - a>c
- b<=d:买不了,输出−1。这和a<c和b>d的情况反过来
 - b>d:我们假设买b个,那么第二个礼包需要花费ceil(b/d)∗c元。第一个礼包花费a元
- ceil(b/d)∗c<=a,买不了,输出−1.我们买b个,人家买第二个礼包更优惠,买大于b个也一样。小于b个也一样
 - ceil(b/d)∗c>a,买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);
            }
        }
    }
}
        题目内容
小红是一个来自桃花村的年轻人,他从小就喜欢吃桃子。
今年桃子丰收,他想买一些桃子存放起来,以备过冬之用。他听说附近有一个卖桃子的商家,提供两种不同的桃子礼包。
小红很感兴趣,于是他前往商家那里看看。商家告诉他,第一种礼包包含 b 个桃子,售价为 a 元,第二种礼包包含 d 个桃子,售价为 c 元。
每个礼包可以买任意次,但只能选择一种礼包购买。
小红需要购买至少 k 个桃子,他希望只购买礼包 1 的花费比只购买礼包 2 的花费要小。
你能帮小红求出这个 k 吗?
输入描述
第一行输入一个正整数 t ,代表询问的次数。
接下来的 t 行,每行输入四个正整数 a , b , c , d ,用空格隔开。
1≤t≤103
1≤a,b,c,d≤109
输出描述
对于每行询问,输出一个合法的正整数 k ( 0<k<231 ), 代表买桃子的数量。
有多解时输出任意即可。如果无解则直接输出 −1 。
样例
输入
3
1 2 3 4
4 3 3 4
5 3 4 5
输出
2
-1
-1