网易2:路灯
一条长l的笔直的街道上有n个路灯,若这条街的起点为0,终点为l,第i个路灯坐标为ai ,每盏灯可以覆盖到的最远距离为d,为了照明需求,所有灯的灯光必须覆盖整条街,但是为了省电,要使这个d最小,请找到这个最小的d。
#include<iostream> #include<iomanip> #include<vector> #include<algorithm> using namespace std; /* 思路:先将路灯坐标排序,找出两个路灯的最大间隔maxGap。 特别注意还得对两端特别处理,考虑到若街道两端没有路灯,则添加首端距离startGap和末端距离endGap。 中间路灯maxGap向两边发散灯光,所以照明范围是maxGap/2.0;端点处路灯只向一端发散,所以照明范围是max(startGap,endGap). 比较这两个发散距离,取大的一个输出。 同时题目要求保留两位小数,c++中添加头文件<iomanip>,使用fixed和setprecision(2)即可。 */ int main() { int n, l; while (cin>>n>>l) { vector<int> lamp(n); for (int i = 0; i < n; i++) { cin >> lamp[i]; } sort(lamp.begin(), lamp.end()); //首端和末端距离 int startGap=lamp[0]-0,endGap=l-lamp[n-1]; //计算中间最大距离 int maxGap=0; for (int i = 0; i < n-1; i++) { int gap = lamp[i + 1] - lamp[i]; if (maxGap < gap) maxGap = gap; } //比较两个灯光发散范围maxGap/2.0和max(startGap, endGap),输出结果 if (maxGap/2.0 <= max(startGap, endGap)) { maxGap = max(startGap, endGap); //注意c++中输出指定位数小数方法 cout << fixed << setprecision(2) << maxGap/1.0 << endl; } else { cout << fixed << setprecision(2) << maxGap / 2.0 << endl; } } return 0; }