描述 安博士有一张含有N个格子排在一行的纸,有些格子里有数字,有些格子里是空白的,把这N个格子组成序列A。 然后他在一张新的纸上画了一行N个空白格子。现在要求小明按照以下规则来在空白格子中填数,最终得到序列A。 规则1:在一次填数中,小明可以选择多个不同的连续区间(但这些区间不能相交),每个区间只能填同一个数字,但不同的区间不能填同样的数字。 规则2:每次填数的区间是独立的,也就是说下次填数选择的区间和上次填数选择的区间相交是没有关系的。但每个数字只能使用1次,也就是说上次填过的数字后面的填数中都不可以再用。 问:小明最少需要多少次填数就可以得到序列A,如果无法办到,输出-1。 注意:序列中的数字0表示那个格子没有填写任何数字,仍然是空白格子。 输入 输入第1行一个整数N, 接下来输入N行,每行一个整数,第i行表示序列中的数字Ai。Ai为0,表示那个格子是空白格子。 输出 输出一行1个整数,表示答案。 输入样例 1 8 0 1 4 5 1 3 6 3 输出样例 1 2 输入样例 2 4 1 2 1 2 输出样例 2 -1 提示 1≤N≤100000; 0≤格子里的数≤100000; 样例1解释: 第1次填数结束后变成: 0 1 1 1 1 3 3 第2次填数结束后变成: 0 1 4 5 1 3 3 所以答案是2 c++代码,不要解释
时间: 2024-04-21 07:22:27 浏览: 206
```cpp
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
int main() {
int N;
cin >> N;
vector<int> A(N);
for (int i = 0; i < N; i++) {
cin >> A[i];
}
int count = 0;
unordered_set<int> used;
for (int i = 0; i < N; i++) {
if (A[i] == 0) {
continue;
}
if (used.find(A[i]) != used.end()) {
cout << -1 << endl;
return 0;
}
used.insert(A[i]);
count++;
while (i + 1 < N && (A[i + 1] == A[i] || A[i + 1] == 0)) {
i++;
}
}
cout << count << endl;
return 0;
}
```
阅读全文