题目描述V先生有一天工作到很晚,回家的时候要穿过一条长l的笔直的街道,这条街道上有n个路灯。假设这条街起点为0,终点为l,第i个路灯坐标为ai。路灯发光能力以正数d来衡量,其中d表示路灯能够照亮的街道上的点与路灯的最远距离,所有路灯发光能力相同。为了让V先生看清回家的路,路灯必须照亮整条街道,又为了节省电力希望找到最小的d是多少?
输入
输入两行数据,第一行是两个整数:路灯数目n (1≤n≤1000),街道长度l (1 ≤l≤109)。第二行有n个整数ai (0 ≤ ai≤ l),表示路灯坐标,多个路灯可以在同一个点,也可以安放在终点位置。
输出输出能够照亮整个街道的最小d,保留两位小数。
样例输入7 15
15 5 3 7 9 14 0
样例输出2.50
#include <iostream> #include <algorithm> using namespace std; class streetlight { public: int loc; //路灯的位置 int num; //该位置路灯数量 }; int main() { streetlight strl[1000];//整理后路灯位置和数量数组 int loc[1000];//路灯位置数组 int l, n; //道路长度,路灯总数 int j = 0; //记录整理后路灯位置数 double d; //d的值 cin >> n >> l; for (int i = 0; i<n; i++) { cin >> loc[i]; } sort(loc, loc + n); for (int i = 0; i<n; i++) { if (i == 0) { strl[j].loc = loc[i]; strl[j].num = 1; j++; } else if (strl[j - 1].loc == loc[i]) { strl[j - 1].num++; } else { strl[j].loc = loc[i]; strl[j].num = 1; j++; } } for (int i = 0; i <= j; i++) { double temp; if (i == 0) { d = strl[i].loc / strl[i].num; } else { if (i == j) temp = (double)(l - strl[i - 1].loc) / strl[i - 1].num; else temp = (double)(strl[i].loc - strl[i - 1].loc) / (strl[i].num + strl[i - 1].num); if (temp>d) d = temp; } } printf("%.2f", d); system("pause"); return 0; }
路灯
最新推荐文章于 2023-05-15 23:22:31 发布