CF #737(div2)A. Ezzat and Two Subsequences,贪心

Posted 小哈里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF #737(div2)A. Ezzat and Two Subsequences,贪心相关的知识,希望对你有一定的参考价值。

problem

A. Ezzat and Two Subsequences
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
Ezzat has an array of n integers (maybe negative). He wants to split it into two non-empty subsequences a and b, such that every element from the array belongs to exactly one subsequence, and the value of f(a)+f(b) is the maximum possible value, where f(x) is the average of the subsequence x.

A sequence x is a subsequence of a sequence y if x can be obtained from y by deletion of several (possibly, zero or all) elements.

The average of a subsequence is the sum of the numbers of this subsequence divided by the size of the subsequence.

For example, the average of [1,5,6] is (1+5+6)/3=12/3=4, so f([1,5,6])=4.

Input
The first line contains a single integer t (1≤t≤103)— the number of test cases. Each test case consists of two lines.

The first line contains a single integer n (2≤n≤105).

The second line contains n integers a1,a2,…,an (−109≤ai≤109).

It is guaranteed that the sum of n over all test cases does not exceed 3⋅105.

Output
For each test case, print a single value — the maximum value that Ezzat can achieve.

Your answer is considered correct if its absolute or relative error does not exceed 10−6.

Formally, let your answer be a, and the jury’s answer be b. Your answer is accepted if and only if |a−b|max(1,|b|)≤10−6.

Example
inputCopy
4
3
3 1 2
3
-7 -6 -6
3
2 2 2
4
17 3 5 -3
outputCopy
4.500000000
-12.500000000
4.000000000
18.666666667
Note
In the first test case, the array is [3,1,2]. These are all the possible ways to split this array:

a=[3], b=[1,2], so the value of f(a)+f(b)=3+1.5=4.5.
a=[3,1], b=[2], so the value of f(a)+f(b)=2+2=4.
a=[3,2], b=[1], so the value of f(a)+f(b)=2.5+1=3.5.
Therefore, the maximum possible value 4.5.
In the second test case, the array is [−7,−6,−6]. These are all the possible ways to split this array:

a=[−7], b=[−6,−6], so the value of f(a)+f(b)=(−7)+(−6)=−13.
a=[−7,−6], b=[−6], so the value of f(a)+f(b)=(−6.5)+(−6)=−12.5.
Therefore, the maximum possible value −12.5.

solution

题意

  • 给出一个长为 n 的序列,将其分为两个部分,定义f(x)为两部分平均值之和,求最小化f(x)

思路:

  • 容易想到,一个数放在集合里算平均数,肯定会被做除法变小,除非它单独一个,所以我们让最大的单独一个集合,剩下的一个集合即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
int a[maxn];
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int T;  cin>>T;
	while(T--){
		int n;  cin>>n;
		for(int i = 1; i <= n; i++)cin>>a[i];
		sort(a+1,a+n+1);
		double ans = 0;
		for(int i = 1; i < n; i++){
			ans += a[i];
		}
		ans /= (n-1);
		ans += a[n];
		printf("%.10lf\\n", ans);
	}
	return 0;
}


以上是关于CF #737(div2)A. Ezzat and Two Subsequences,贪心的主要内容,如果未能解决你的问题,请参考以下文章

CF #737(div2)B. Moamen and k-subarrays,贪心,下标

Codeforces Round #737 (Div. 2) Ezzat and Grid(线段树优化dp)

CF #738(div2)A. Mocha and Math(贪心)

Codeforces Round #737 (Div. 2) D. Ezzat and Grid(线段树,dp)

Codeforces Round #737 (Div. 2) D. Ezzat and Grid 线段树模拟最长上升子序列

CF #724(div2)A. Omkar and Bad Story,贪心,构造序列