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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
文章来源: gwj1314.blog.csdn.net,作者:小哈里,版权归原作者所有,如需转载,请联系作者。
原文链接:gwj1314.blog.csdn.net/article/details/119581325
- 点赞
- 收藏
- 关注作者
评论(0)