首页 > 代码库 > 每日编程-20170331

每日编程-20170331

题目:给定一个递增序列,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 }

每日编程-20170331