【CSP-J模拟题 】 附详细讲解
题目描述
在一条数轴上有 NN 个村庄,每个村庄的位置是一个整数。
每个村庄的“邻域”定义为:数轴上所有离这个村庄比离其他任何村庄都近的点。若某个点与两个村庄等距,则同时属于两个村庄的邻域。
对于最左和最右的村庄,邻域大小视为无限大。
对其他村庄,邻域大小等于其左边界和右边界之间的距离。
求所有具有有限邻域的村庄中,最小的邻域大小,结果保留一位小数。
输入格式
第一行一个正整数 NN ,表示村庄数量。
第二行 NN 个互不相同的正整数 aiai ,表示村庄坐标。
输出格式
输出一个浮点数表示最小邻域大小,保留一位小数。
输入输出样例
输入#1 | 输出#1 |
---|---|
5 16 0 10 4 15 | 3.0 |
说明/提示
对于 40% 的数据,N≤5 N≤5 。
对于 60% 的数据,N≤100 N≤100 。
对于 100% 的数据,3≤N≤10^5,0≤ai≤1093≤N≤10^5,0≤ai≤10^9 。
思路+代码 超详细
万能头 (人机不用)
命名空间
也称“名称空间” 。是许多编程语言使用的一种代码组织的形式,通过命名空间来分类,区别不同的代码功能,
避免不同的代码片段(通常由不同的人协同工作或调用已有的代码片段)同时使用时由于不同代码间变量名相同而造成冲突。
定义变量与数组 n: a数组长度 a数组:存村庄坐标
定义double变量mn寻找最小值
定义主函数
用cin输入n
用for循环n次 输入a数组
输入a数组第i个
对应for循环
利用头文件自带函数sort进行对a数组1的排序
用for循环n-2次 输入a数组
a[0]和a[n]的邻域无限大,不计入
定义变量y存第i个村子的邻域大小
y除2
用if判断如果mn大于y
则让m变为y
对应if
对应for循环
利用printf保留一位小数输出
返回值 0
对应主函数
代码
#include<bits/stdc++.h>//万能头 (人机不用)
using namespace std;//命名空间
//也称“名称空间” 。是许多编程语言使用的一种代码组织的形式,通过命名空间来分类,区别不同的代码功能,
//避免不同的代码片段(通常由不同的人协同工作或调用已有的代码片段)同时使用时由于不同代码间变量名相同而造成冲突。
int n,a[10005];//定义变量与数组 n: a数组长度 a数组:存村庄坐标
double mn=999999;//定义double变量mn寻找最小值
int main(){//定义主函数cin>>n;//用cin输入nfor(int i=0;i<n;i++){//用for循环n次 输入a数组cin>>a[i];//输入a数组第i个}//对应for循环sort(a,a+n);//利用头文件自带函数sort进行对a数组1的排序//for(int i=0;i<n;i++)cout<<a[i]<<" ";//cout<<endl;for(int i=1;i<n-1;i++){//用for循环n-2次 输入a数组//a[0]和a[n]的邻域无限大,不计入double y=(a[i]-a[i-1]+a[i+1]-a[i]);//定义变量y存第i个村子的邻域大小y=y/2;;//y除2if(mn>y){//用if判断如果mn大于ymn=y;//则让m变为y//cout<<i<<" "<<y<<" "<<mn<<endl;}//对应if//mn=min(mn, (a[i]-a[i-1])/2);//double用不了}//对应for循环printf("%.1f",mn);//利用printf保留一位小数输出return 0;//返回值 0
}//对应主函数