CF42A
题意
给定两个序列 a 和 b。
序列 a 中的各个数之间的比例可以得出一个 x 。
当 b 中比例满足 a 中比例,即 \(b_1\):\(b_2\):\(b_3\)…… \(=\) \(a_1\):\(a_2\):\(a_3\)……时,可以得出一个数 $x * \dfrac{b}{a} $。
分析
因为这是做汤按照一定比例才能得出一个与 x 成倍数关系的数。
所以我们可以知道,如果有一个数与其他的数不成比例且小于其他数时,整个数列得出的数都会被那个数影响。
所以我们先找出所有的 b/a 里面最小的那个,因为他决定了结果的大小。
然后让整个数列都以这个最小比例做汤求 x 。
另外,他给定了锅的大小也就是 x 的上限 v ,所以得出的那个数如果超过 v ,那就要把它赋值成 v 就好了。
注意:他要求你的数要与他的答案的差值大小不超过十的负四次方,也就是要你至少精确到小数点后四位。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define maxn 300050
#define maxm 1010
using namespace std;
int n;
double v,a[maxn],b[maxn],x[maxn];
int main(){
cin>>n>>v;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++){
x[i]=b[i]/a[i];
}
sort(x+1,x+n+1);我开了一整个数组来求一个最小值有点浪费,其实可以通过边求边比的方法取;
double ans=0.0;
for(int i=1;i<=n;i++){
ans+=x[1]*a[i];
}
ans=min(ans,v);
printf("%.4lf",ans);
return 0;
}
制作不易,不喜勿喷。