这把锁从左到右有 � n 个数,组成了一个序列 { � } {a}。 由于 GOD_hj 的记性不好,所以只要将锁设置为输入任意单峰序列即可打开。具体为: � 1 ≤ ⋯ ≤ � � ≥ � � + 1 ≥ ⋯ ≥ � � ( 1 ≤ � ≤ � ) a 1 ≤⋯≤a i ≥a i+1 ≥⋯≥a n (1≤i≤n) GOD_hj 的锁是拨动式的,即拨一下就能换成临近的一个数( 0 0 和 9 9 可以互换)。 求最少拨几下可以开锁。请写出c++代码
时间: 2024-03-23 21:38:15 浏览: 110
以下是使用 O(nlogn) 算法求解的 C++ 代码:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n+1);
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
vector<int> d(n+1, INT_MAX); // d[i] 表示长度为 i 的最长不降子序列的末尾元素的最小值
d[1] = a[1];
int len = 1; // 当前最长不降子序列的长度
for (int i = 2; i <= n; i++) {
int j = lower_bound(d.begin()+1, d.begin()+len+1, a[i]) - d.begin();
d[j] = a[i];
if (j > len) len = j;
}
cout << n - len << endl; // 需要拨动的次数为 n - len
return 0;
}
```
阅读全文