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;
}

制作不易,不喜勿喷。

原文地址:https://www.cnblogs.com/KnightL/p/13935250.html