时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
Sherry现在碰到了一个棘手的问题,有N个整数需要排序。
Sherry手头能用的工具就是若干个双端队列。
她需要依次处理这N个数,对于每个数,Sherry能做以下两件事:
- 新建一个双端队列,并将当前数作为这个队列中的唯一的数;
- 将当前数放入已有的队列的头之前或者尾之后。
对所有的数处理完成之后,Sherry将这些队列排序后就可以得到一个非降的序列。
输入描述:
第一行包含一个整数N,表示整数的个数。接下来的N行每行包含一个整数Di,其中Di表示所需处理的整数。
输出描述:
其中只包含一行,为Sherry最少需要的双端队列数。
#include <iostream>
#include <deque>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int N;
cin >> N;
vector<int> nums(N);
for (int i = 0; i < N; ++i) {
cin >> nums[i];
}
deque<int> deq;
for (int num : nums) {
if (!deq.empty() && deq.back() > num) {
deq.push_front(num);
} else if (deq.empty() || deq.front() < num) {
deq.push_back(num);
} else {
deq.push_front(num);
deq.pop_back();
}
}
vector<int> dp(N + 1, 1);
for (int i = 1; i <= N; ++i) {
for (int j = 0; j < i; ++j) {
if (nums[j] < nums[i - 1]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
}
cout << *max_element(dp.begin(), dp.end()) << endl;
return 0;
}