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

举报
小哈里 发表于 2022/05/11 01:23:32 2022/05/11
【摘要】 problem A. Ezzat and Two Subsequences time limit per test1 second memory limit per test256 megabytes ...

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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。