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,导致满足了条件需要多次输入,自己设想的转化成代码实现时还是很不熟练。。。
本题要注意的地方就是中位数在存储数据中的哪个位置。
n | n/2 | (n-1)/2 | n/2-1 |
---|---|---|---|
1 | 0 | 0 | -1 |
2 | 1 | 0 | 0 |
3 | 1 | 1 | 0 |
4 | 2 | 1 | 1 |