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 线段树模拟最长上升子序列