一本通题库 第一部分 C++语言 --> 第五章 数 组 1114:白细胞计数

1114:白细胞计数

时间限制: 1000 ms         内存限制: 65536 KB
提交数: 26662     通过数: 8522

【题目描述】

医院采样了某临床病例治疗期间的白细胞数量样本nn份,用于分析某种新抗生素对该病例的治疗效果。为了降低分析误差,要先从这nn份样本中去除一个数值最大的样本和一个数值最小的样本,然后将剩余n−2n−2个有效样本的平均值作为分析指标。同时,为了观察该抗生素的疗效是否稳定,还要给出该平均值的误差,即所有有效样本(即不包括已扣除的两个样本)与该平均值之差的绝对值的最大值。

现在请你编写程序,根据提供的nn个样本值,计算出该病例的平均白细胞数量和对应的误差。

【输入】

输入的第一行是一个正整数n(2<n≤300)n(2<n≤300),表明共有nn个样本。

以下共有nn行,每行为一个浮点数,为对应的白细胞数量,其单位为109/L109/L。数与数之间以一个空格分开。

【输出】

输出为两个浮点数,中间以一个空格分开。分别为平均白细胞数量和对应的误差,单位也是109/L109/L。计算结果需保留到小数点后22位。

源代码

#include<cstdio>
#include<iostream>
using namespace std;
double a[300],b[300];
int main(void)
{ double max1=0,min=301;
  int i;
  double n,near,max2=0,p,s,d,c;

  scanf("%lf",&n);

  for(i=1;i<=n;i++)
	 {
	    scanf("%lf",&a[i]);
	    s+=a[i];
     }

  for(i=1;i<=n;i++)
  {
     if(max1<a[i])
     {
	    max1=a[i];
        d=i;
     }
  } 

    for(i=1;i<=n;i++)
  {
     if(a[i]<min)
    {
	   min=a[i];
	   c=i;
    }
  }

   s=s-max1-min;
   p=1.0*s/(n-2);

  for(i=1;i<=n;i++)
  {
	  if((i!=d)&&(i!=c))
	{
	   b[i]=p-a[i];
  	  if(b[i]<0)
  	    b[i]=(-1)*b[i];
	}
	  else
	   b[i]=-1;
  }
  for(int i=1;i<=n;i++)
  {
     if(b[i]>max2)
      max2=b[i];
  }

   printf("%.2lf %.2lf\n",p,max2);	  

   return 0;
}这道题着实简单,思路明了,但是细节之处让我受益匪浅。数据的格式是十分重要,跨格式的运算往往是行不通的。

原先虐心代码(乍一看没啥区别)
#include<cstdio>
#include<iostream>
using namespace std;
float a[300],b[300];
int main(void)
{ int max1=0,min=301,i;
  float n,near,max2=0,p,s,d,c;

  scanf("%f",&n);

  for(i=1;i<=n;i++)
	 {
	    scanf("%f",&a[i]);
	    s+=a[i];
     }

  for(i=1;i<=n;i++)
  {
     if(max1<a[i])
     {
	    max1=a[i];
        d=i;
     }
  } 

    for(i=1;i<=n;i++)
  {
     if(a[i]<min)
    {
	   min=a[i];
	   c=i;
    }
  }

   s=s-max1-min;
   p=1.0*s/(n-2);

  for(i=1;i<=n;i++)
  {
	  if((i!=d)&&(i!=c))
	{
	   b[i]=p-a[i];
  	  if(b[i]<0)
  	    b[i]=(-1)*b[i];
	}
	  else
	   b[i]=-1;
  }
  for(int i=1;i<=n;i++)
  {
     if(b[i]>max2)
      max2=b[i];
  }

   printf("%.2f %.2f",p,max2);	  

   return 0;
}
错误即在标红处,所以说,还是细节决定成败,数据的格式类型会导致不同的运算结果,所以在这一方面更要小心谨慎

原文地址:https://www.cnblogs.com/jd1412/p/12244171.html

时间: 2024-10-13 22:56:41

一本通题库 第一部分 C++语言 --> 第五章 数 组 1114:白细胞计数的相关文章

一本通题库 第一部分 C++语言 --&gt; 第五章 数 组 1116:最长平台

1116:最长平台 时间限制: 1000 ms         内存限制: 65536 KB提交数: 30087     通过数: 9565 [题目描述] 已知一个已经从小到大排序的数组,这个数组的一个平台(Plateau)就是连续的一串值相同的元素,并且这一串元素不能再延伸.例如,在 1,2,2,3,3,3,4,5,5,61,2,2,3,3,3,4,5,5,6中1,2−2,3−3−3,4,5−5,61,2−2,3−3−3,4,5−5,6都是平台.试编写一个程序,接收一个数组,把这个数组最长的平

一本同题库 第一部分 C++语言 --&gt; 第四章 循环结构的程序设计 1099

1099:第n小的质数 时间限制: 1000 ms         内存限制: 65536 KB提交数: 19092     通过数: 9527 [题目描述] 输入一个正整数n,求第n小的质数. [输入] 一个不超过10000的正整数n. [输出] 第n小的质数. [输入样例] 10 [输出样例] 29 源代码 #include<iostream> #include<cmath> using namespace std; int main() { int n; int i,j; i

一本通题库1111

本人极菜,第一次写博,拿了到比较简单的,漏洞过多,围观者多包涵(有点激动). 这是一道比较水的题库题,不高兴的津津,年前做的时候被空了出来.(毕竟当时太菜) 现在来看,就没那么难了,以下代码. #include<iostream> using namespace std; int a[8][3]; int b[8]; int main() { for(int i=1;i<=7;i++) {for(int j=1;j<=2;j++) cin>>a[i][j]; } for

CCNA题库第一部分

1.Which technology supports the stateless assignment of IPv6 addresses?(Choose two.) 哪些技术支持无状态任务的IPv6地址?(BD) A. DNS B. DHCPv6 C. DHCP D. autoconfiguration 2.After you configure the Loopback0 interface, which command can you enter to verify the status

一本通题库 1115

[题目描述] 给定一个非负整数数组,统计里面每一个数的出现次数.我们只统计到数组里最大的数. 假设 Fmax(Fmax<10000)Fmax(Fmax<10000)是数组里最大的数,那么我们只统计{0,1,2.....Fmax}{0,1,2.....Fmax}里每个数出现的次数. [输入] 第一行nn是数组的大小.1≤n≤100001≤n≤10000. 紧接着一行是数组的nn个元素. [输出] 按顺序输出每个数的出现次数,一行一个数.如果没有出现过,则输出00. 对于例子中的数组,最大的数是3

C语言第五章 语句

在上章中,我们的数据是通过=来赋予变量的,但这不够,它不能为变量赋予程序运行时输入的值,为此我们引入I/O语句来完成, 5.3 变量的作用域 变量的作用域是指变量的作用范围,也称为变量的可见性,很显然,变量在定放之后,并不是任何一个地方都可以使用,如定义在语句块里的变量在语句块外就不可以使用了,一个代码文件里的变量在其它代码文件里也不能使用.依照作用范围的大小,我们把变量分为局部变量和全局变量.

第一行代码笔记-第五章

1.标准广播,异步,所有广播接收器同时接收. 有序广播,同步,同一时间只一个广播接收器接收,待处理完才传递至下一个. 2.动态注册广播接收器,即在代码中注册(记得取消注册),灵活自由,但必须在程序启动后才能接收. 静态注册,即在AndroidManifest.xml中注册,可实现在程序未启动是接收广播. 3.静态注册广播接收器时,"Exported"属性表示是否允许该广播接收器接收本程序以外的广播:"Enabled"表示是否启用该广播接收器. 4.(之前章节的)在a

C语言 第五章 循环结构

一.for 二.while 三.do while 四.continue 五.break 一.for 请在屏幕上输出1000个*号 printf("*************************...."); #include "stdio.h" void main() { int i; for(i=1;i<=1000;i++){ printf("*"); } } for(表达式A:表达式B:表达式C){要重复执行的代码块D;} 1.表达

c语言第五章-循环结构I

需要多次重复执行一个或多个任务的问题考虑使用循环来解决while循环:格式:while(条件表达式){    循环体      }循环三要素:初始化.条件表达式.增量条件表达式必须是可改变的量,否则可能形成死循环while和do while的区别:while循环先判断条件是否为真,再决定是否执行循环体do while循环是先执行一次循环体,再判断当条件为假时,do while比while多执行一次循环嵌套循环:外打行,内打列只有内循环执行完毕,外循环才会执行一次循环结构的特点是,在给定条件成立时