题目:给定一个递增序列,a1 <a2 <...<an 。定义这个序列的最大间隔为d=max{ai+1 - ai }(1≤i<n),现在要从a2 ,a3 ..an-1 中删除一个元素。问剩余序列的最大间隔最小是多少?
输入描述:
第一行,一个正整数n(1<=n<=100),序列长度;接下来n个小于1000的正整数,表示一个递增序列。
输出描述:
输出答案。
输入例子:
5
1 2 3 7 8
输出例子:
4
解答:
首尾不能删
有ak, ak+1, ak+2处,如果删除ak+1,则(ak+2)-(ak)的间隔肯定变大了
所以最大间隔只能不变或者增加
所以,先检查每个ak与ak+2之间的差值(也就是改变后的数列的间隔),找到最小值D‘
与当前的最大间隔D比较
如果D'小于D,则可以获得一个D’的间隔,保留最大间隔D
如果D‘大于D,则只能获得一个D’来代替D
另外,牛客网这道题的用例太差了
只要return当前最大间隔就能通过
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 int Max(int a, int b) { return a < b ? b : a; } 5 int Min(int a, int b) { return a > b ? b : a; } 6 int minDis(vector<int> input) { 7 int answer = input[2] - input[0]; 8 for (auto i = 0; i < input.size() - 2; i++) 9 { 10 answer = Min(answer, input[i + 2] - input[i]); 11 } 12 int maxD = answer; 13 for (auto i = 0; i < input.size() - 1; i++) 14 { 15 maxD = Max(maxD, input[i + 1] - input[i]); 16 } 17 return maxD; 18 } 19 int main() { 20 int n; 21 while (cin >> n) 22 { 23 vector<int> v; 24 int in; 25 for (auto i = 0; i < n; i++) 26 { 27 cin >> in; 28 v.push_back(in); 29 } 30 cout << minDis(v) << endl; 31 } 32 }