【发布时间】:2021-05-14 17:29:27
【问题描述】:
CSES 问题 (https://cses.fi/problemset/task/2216/)。
给你一个数组,其中包含 1…n 之间的每个数字恰好一次。你的任务是按递增顺序收集从 1 到 n 的数字。 在每一轮中,您从左到右遍历数组并收集尽可能多的数字。总轮数是多少? 约束:1≤n≤2⋅10^5
这是我在 c++ 上的代码:
int n, res=0;
cin>>n;
int arr[n];
set <int, greater <int>> lastEl;
for(int i=0; i<n; i++) {
cin>>arr[i];
auto it=lastEl.lower_bound(arr[i]);
if(it==lastEl.end()) res++;
else lastEl.erase(*it);
lastEl.insert(arr[i]);
}
cout<<res;
我遍历数组一次。如果元素 arr[i] 小于之前的所有元素,则我“打开”一个新序列,并将该元素保存为该序列中的最后一个元素。我将已打开序列的最后一个元素存储在集合中。如果 arr[i] 小于之前的一些元素,那么我采用已经存在的具有最大最后一个元素(但小于 arr[i])的序列,并用 arr[i] 替换该序列的最后一个元素。 唉,它只适用于三个给定的两个测试,而第三个测试的输出比它应该的要少得多。我做错了什么?
【问题讨论】:
-
为什么你的代码中有
set?你能用简单的英语解释你的代码试图做什么吗?或者,它应该如何工作?此外,链接的问题仅包含一个示例,因此您关于输出的陈述没有意义。 -
我遍历数组一次。如果元素 arr[i] 小于之前的所有元素,则我“打开”一个新序列,并将该元素保存为该序列中的最后一个元素。我将已打开序列的最后一个元素存储在 set 中。如果元素 arr[i] 小于之前的一些元素,那么我采用其中最大的现有序列(但小于 arr[i]),并用 arr[ 替换该序列的最后一个元素一世]。我的意思是三个测试,在下载的解决方案上执行。感谢您的反馈。
标签: c++ algorithm sorting sequence