Gerianl @ 2024-09-07 19:55:22
#include<stdio.h>
int main(){
int n,i;
double avg=0,sum=0,min,max,max_diff=0;
scanf("%d",&n);
double a[n];
for(i=0;i<n;i++){
scanf("%lf",&a[i]);
}
min = max = a[0];
for(i=0;i<n;i++){
if(a[i]>max){
max=a[i];
}
if(a[i]<min){
min=a[i];
}
sum+=a[i];
}
avg=(sum-max-min)/(n-2);
for(i=0;i<n;i++){
if((a[i]!=max)&&(a[i]!=min)){
double diff = avg - a[i];
if(diff<0){
diff = - diff;
}
if(diff>max_diff){
max_diff=diff;
}
}
}
printf("%.2f %.2f\n",avg,max_diff);
return 0;
}
by liaocr @ 2024-09-07 20:18:57
@Gerianl 奇怪了 有玄学问题 调不出啊
by liaocr @ 2024-09-07 20:24:08
@Gerianl 我一个直觉竟然对了 是double精度问题 不能用
#include<stdio.h>
int main(){
int n,i;
double avg=0,sum=0,min,max,max_diff=0;
scanf("%d",&n);
double a[n];
for(i=0;i<n;i++){
scanf("%lf",&a[i]);
}
int p=0, q=0;
min = max = a[0];
for(i=0;i<n;i++){
if(a[i]>max){
max=a[i];
p=i;
}
if(a[i]<min){
q=i;
min=a[i];
}
sum+=a[i];
}
avg=(sum-max-min)/(n-2);
for(i=0;i<n;i++){
if((i!=p)&&(i!=q)){
double diff = avg - a[i];
if(diff<0){
diff = - diff;
}
if(diff>max_diff){
max_diff=diff;
}
}
}
printf("%.2lf %.2lf\n",avg,max_diff);
return 0;
}
by DESPAIROFSMILE @ 2024-09-07 20:34:33
@liaocr 好像不是精度问题,因为有可能最大的数或最小的数不止一个(有可能有两个数一样,还都是最大的),所以需要标记最大数和最小数的位置(保证只有这两个数)。 另外,建议把min设成一个比较大的数,比方说像0x3f3f3f3f 说真的,我也调了好久
by liaocr @ 2024-09-07 20:38:27
@DESPAIROFSMILE 但我那样改之后AC了 可以去试一下 用一个p,q分别存最大值和最小值时的i 后面判断就用p,q
by DESPAIROFSMILE @ 2024-09-07 20:54:02
@liaocr 是这样,方法没有问题(因为我也是这样做的),但是不是精度的问题,因为i是坐标(坐标不能是浮点数),不是其中的元素,记录坐标是为了防止重复把其他数也算进去,和精度没有关系。
by liaocr @ 2024-09-08 10:25:39
@DESPAIROFSMILE 哦 懂了
by __egoist__ @ 2024-09-14 16:21:10
@liaocr 因为那些给出的数据会出现重复的,如果用记录具体数据的方法去判断最大和最小,会导致有一些重复数会没算进去导致结果偏小,所以只需要记录位置就可以了
by _liujunming_ @ 2024-09-15 11:48:15
@liaocr
这样是不是也可以?
#include<bits/stdc++.h>
using namespace std;
double white[500];
int main()
{
double ans=0,absans=0,maxx=0,minn=1e9;
int n,maxwhite,minwhite;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>white[i];
if(white[i]>maxx)
{
maxx=white[i];
maxwhite=i;
}
if(white[i]<minn)
{
minn=white[i];
minwhite=i;
}
}
for(int i=1;i<=n;i++)
if(i!=maxwhite&&i!=minwhite)ans+=white[i];
ans/=(n-2);
for(int i=1;i<=n;i++)
if(i!=maxwhite&&i!=minwhite&&abs(white[i]-ans)>absans)absans=abs(white[i]-ans);
printf("%.2lf %.2lf",ans,absans);
return 0;
}
by MAXCYP @ 2024-10-05 10:05:32
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;
int n;double a[301], m, s, x;
int main()
{
cin >> n;
for(int i = 0;i < n;++i)
cin >> a[i];
sort(a, a + n);
for(int i = 1;i < n - 1;++i)
m += a[i];
s = m / (n - 2);
printf("%.2lf ", s);
for(int i = 1;i < n - 1;++i)
x = max(x, fabs(a[i] - s));
printf("%.2lf", x);
return 0;
}