50分求助

B2095 白细胞计数

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;
}

|