为了更好的阅读体检,可以查看我的算法学习网
本题在线评测链接: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 1≤t≤103
1 ≤ a , b , c , d ≤ 1 0 9 1\le a,b,c,d\le 10^9 1≤a,b,c,d≤109
输出描述
对于每行询问,输出一个合法的正整数 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);
}
}
}
}