大家好 我是寸铁 希望这篇题解对你有用,麻烦动动手指点个赞或关注,感谢您的关注!
题目描述
某种鸡尾酒由 n 种饮品(编号 1∼n)混合调制而成。
在调制该鸡尾酒时,n种饮品必须严格按照 a1:a2:...:an的比例进行混合。
n种饮品的实际现有量分别为 b1,b2,...,bn升。
现在,请你用一个最大容积为 v
升的量杯来调制该鸡尾酒,利用此量杯一次可以调制出 0∼v升鸡尾酒。
由于时间有限,你只能调制一次。
请问,利用现有材料和给定量杯,你最多可以调制出多少升鸡尾酒。
注意:
调制出的鸡尾酒量不一定是整数。
由于只能调制一次,所以无论材料多么充裕,你都最多只能调制出 v 升鸡尾酒。
输入格式
第一行包含两个整数 n,v。
第二行包含 n个整数 a1,a2,...,an。
第三行包含 n个整数 b1,b2,...,bn。
输出格式
一个实数,表示可以调制出的鸡尾酒的最大量(单位:升)。
输出结果与正确答案的相对或绝对误差小于 10−4,则视为正确。
数据范围
前 4个测试点满足 1≤n≤2。
所有测试点满足 1≤n≤20,1≤v≤10000,1≤ai≤100,0≤bi≤100。
输入样例1:
1 100
1
40
输出样例1:
40.0
输入样例2:
2 100
1 1
25 30
输出样例2:
50.0
输入样例3:
2 100
1 1
60 60
输出样例3:
100.0
思路
按下面比例混合
a1:a2:a3:...:an
不妨已该比例ai
作为变量
去计算可以取出来的公共体积 x
即 a1 *x + a2*x+ a3*x +...+ an*x = (a1 + a2 + a3 + ... +an) * x
- 对于每一 个**
ai
**有:
ai * x <= bi (最多只能取bi升)
即0 < x <= bi / ai
- 对于所有 的
ai
有:
sum+=a[i]
sum * x <= v (最多只能取v升)
即0< x <= v / sum
两者取交集即**x = min(x ,v / sum);
**
最后的答案:
ans = x * sum
注意
x
和 sum
要取 double
题目允许存在小数部分,不取double,会wa
Accode
java
import java.util.*;
public class Main{
static int N = 30;
static int a[] = new int[N];
static int b[] = new int[N];
public static void main(String []args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int v = sc.nextInt();
for(int i = 1; i <= n; i++)a[i] = sc.nextInt();
for(int j = 1; j <= n; j++)b[j] = sc.nextInt();
double x = 0x3f3f3f3f , sum = 0;
for(int i = 1; i <= n; i++){
x = Math.min(x , (double)b[i]/a[i]);
sum += a[i];
}
x = Math.min(x , v / sum);
System.out.println(x * sum);
}
}