csp练题记录(C语言,编译器dev c++)201903-1小中大

csp练题记录(C语言,编译器dev c++)201903-1小中大

一、题目描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述

二、思路分析

本题思路还是比较明确的,但是编写程序提交时,并不是一帆风顺的(主要是自己太渣了,此处不找借口(。•́︿•̀。)),下文将详细阐述我的想法和我自查找出来的问题,欢迎大家提出简易批评。
初始代码:
数据存储分析:直接暴力的一个data[100000]解决。
最值的确定:由于是有序的,所以考虑它是升/降序就可以确定最值是哪两个,又考虑到数据是可重复的,基于上述两点我就使用了一个while循环来遍历整个数组,来判断前后数字的大小关系。这就牵涉到全部数相等的情况,加设一个标识量allsame表示(初始代码的版本里没用到)。
错误原因猜测:n=1的情况处理不了。
(其实并不是写的第一个,想法的第一阶段啦(。>∀<。))

三、代码

1、初始代码(score:30;评测结果:运行错误)

#include<stdio.h>
int main()
{
 int n,i,j,min,max;
    int data[100000];
    int allsame=0;
 scanf("%d",&n);
 //读入数据
 for(i=0;i<n;i++)
 {
  scanf("%d",&data[i]);
 }
 if(data[0]==data[n-1])//全相等 
  {
   allsame=1;
   min=data[0];
   max=data[n-1];
  }
 i=0;
 while(i<n)
 {
  if(data[i]!=data[i+1])
  {
   if(data[i]<data[i+1])//降序排列
   {min=data[0];max=data[n-1];} 
   else//升序排列 
   {min=data[n-1];max=data[0];}
   break;
  }
  i++;
 }
 //找中位数
 if(n%2==0)//偶数个数,则中位数为n/2-1与 n/2+1平均数
    {
  
  if((data[n/2-1]+data[n/2])%2==0)
  printf("%d %d %d",max,(data[n/2-1]+data[n/2])/2,min);
  else
  printf("%d %.1f %d",max,(float)(data[n/2-1]+data[n/2])/2.0,min);
 } 
 else
 {
  printf("%d %d %d",max,data[n/2],min);
 }
 return 0;
} 

2、提交后满分代码:

#include<stdio.h>
int b[100000];
int main()
{
 int n,min,max;
 scanf("%d",&n);
 int i,j;
 for(i=0;i<n;i++)
 {
  scanf("%d",&b[i]);
 }
 //
 min=b[0];
 max=b[n-1];
 if(min>max)
 {
  max=b[0];
  min=b[n-1];
 }
 //
 if(n%2==1)
 {
  printf("%d %d %d",max,b[n/2],min);
 }
 else
 {
  int m=(n-1)/2;
  if((b[m]+b[m+1])%2==0)
  printf("%d %d %d",max,(b[m]+b[m+1])/2,min);
  else
  printf("%d %.1f %d",max,(float)((b[m]+b[m+1])/2.0),min);
 }
 return 0;
}

3、另一种思路20分

错误原因:多个scanf,小于3时要一直输入或许还有其他错误

#include<stdio.h>
int main()
{
 int n,i,min,max;
 int a[4];
 scanf("%d",&n);
 for(i=0;i<n;i++)
 {
  if(i==0)
  scanf("%d",&a[0]);
  if(i==n-1)
  scanf("%d",&a[3]);
  if(i==n/2)
  scanf("%d",&a[2]);
  if(i==n/2-1)
  scanf("%d",&a[1]); 
 }
 min=a[0];
 max=a[3];
 if(min>max)
 {
  min=a[3];
  max=a[0];
 }
 if(n%2==1)
 printf("%d %d %d",max,a[2],min);
 else
 {
  if((a[1]+a[2])%2==0)
  printf("%d %d %d",max,(a[1]+a[2])/2,min);
  else
  printf("%d %.1f %d",max,(a[1]+a[2])/2.0,min);
 }
 return 0;
}

四、反思总结

感觉很困惑,三、3的代码没找到什么不对的地方啊,但是输入n=3的时候就有问题,得输入4次才出结果(不知道原因在哪):由于有多个scanf,导致满足了条件需要多次输入,自己设想的转化成代码实现时还是很不熟练。。。
本题要注意的地方就是中位数在存储数据中的哪个位置。

nn/2(n-1)/2n/2-1
100-1
2100
3110
4211
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值