4 条回复
哪有那么麻烦,其实这道题在输入数组的头插入一个略大于头的数,在尾插入一个略大于尾的数,剩下的就是完完全全的贪心了,只要找到最低点就记录下标,最后再遍历一遍就可以了。(你可以考虑一下,这种做法不论如何找到的都是最低点,算两个最低点之间的长度,用前项减去后项就可以了。)
我的C++代码如下:
#include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; vector<int> A(n + 2, 0); for (int i = 1; i <= n; i++) { cin >> A[i]; } A[0] = A[1] + 1; A[n + 1] = A[n] + 1; vector<int> down; for (int i = 1; i <= n; i++) { if (A[i] < A[i - 1] && A[i] < A[i + 1]) { down.push_back(i - 1); } } int minp = 0, maxp = 0; int maxlen = 0; for (int i = 0; i < down.size() - 1; i++) { int len = down[i + 1] - down[i]; if (maxlen < len) { maxlen = len; minp = down[i]; maxp = down[i + 1]; } } if (maxlen < 2) { minp = maxp = -1; } cout << minp << " " << maxp << endl; return 0; }
仅供参考,反正我还是想了一会儿才出此下策!!!
添加回复