10分 已经茫然在循环体中

B2095 白细胞计数

MaoYuXing @ 2021-10-15 21:39:46


#include <cstdio>
#include <iostream>
#include <cmath>
#include <iomanip>
#include <algorithm>
using namespace std;
long long  tol=0,m,cha;
double n,minn=10000000000,q,maxn=0;
int main()
    {
    cin>>m;
    for(int i=1;i<=m;i++)
    {
    cin>>n; 
    tol+=n;

    for(int j=1;j<=n;j++)
    maxn=max(maxn,n);

    for(int k=n;k>=1;k--)
    minn=min(minn,n);

    }   
    tol=tol-maxn-minn;
    q=tol*1.0/(m-2);

    for(int q=1;q<=m;q++)
    {

    if(q!=maxn&&q!=minn)
    cha=fabs(n-q);
    }
    cout<<fixed<<setprecision(2)<<q*1.0<<" "<<cha*1.0;
    return 0;
    }

by 雨伞CKY @ 2021-10-15 22:45:05

@MaoYuXing 对于每个样本,你直接把输入存储至变量 \mathsf{n},而不是存储至 \mathsf{A_{i}}。这样,你的程序不应这样计算误差值。

如果你想节省空间,你应使用分治算法或使用nth_element(建议你先完成P1923 【深基9.例4】求第 k 小的数 - 洛谷)。

以下程序可以获取输入的 m(m\geq 2) 个数中第二大的数。

#include <iostream>
using namespace std;

int m,n,big1,big2;

int main(){
    cin >> m >> big1;
    for (int i = 2;i <= m;i++){
        cin >> n;
        if (n > big1){
            big2 = big1;
            big1 = n;
        }
        else if (n > big2){
            big2 = n;
        }
    }
    cout << big2;
    return 0;
}

你可以根据上面这种思路求出第二大、第二小的数,以计算误差。当然,你也可以存储为一个数组。

此外,当计算最大值和最小值(\mathsf{maxn}\mathsf{minn})时,不需要再次循环。


by MaoYuXing @ 2021-10-16 21:24:04

@雨伞CKY

目前自身水平还触及不到分治思想 nth_element 不过还是谢谢您提出来的改正意见 感谢指点


by MaoYuXing @ 2021-10-16 21:25:17

@雨伞CKY 感谢您的程序


|