cancan1030 @ 2024-02-06 09:44:21
二分栈解法,样例过了,但才40分 [QAQ]
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int a[N],b[N],cnt;
int main(){
int n;
cin>>n;
memset(b,N,sizeof(b));
b[0]=b[1]=-N;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1,j=0;i<=n;i++){
if(a[i]<b[j]&&a[i]>b[j-1]){
b[j]=a[i];
// for(int k=1;k<=n;k++){
// cout<<b[k]<<" ";
// }
// cout<<endl;
}
else if(a[i]>b[j]){
// cout<<a[i+1]<<" ";
b[++j]=a[i];
// for(int k=1;k<=n;k++){
// cout<<b[k]<<" ";
// }
// cout<<endl;
cnt++;
}
}
cout<<cnt;
return 0;
}
by Michelle01 @ 2024-02-06 10:40:27
@cancan1030 那不对呀 你看看 最长上升子序列是像1 2 3 4 5这样的才是 它们之间的差都是一 才符合 你不能只判断只要比他大就算
by cancan1030 @ 2024-02-06 10:46:00
@Michelle01 为什么 [?w?]
by Michelle01 @ 2024-02-06 10:49:41
@cancan1030 仔细读题
by Michelle01 @ 2024-02-06 10:51:23
@cancan1030 你还得判断 你找出的最长上升子序列是否是逐渐递增的 并且递增的值为1 这样能理解了吧
by cancan1030 @ 2024-02-06 10:59:34
@Michelle01 那什么样的数据会导致这个程序出现问题呢?
(我找了半天反例 [TWT])
by Michelle01 @ 2024-02-06 11:07:43
@cancan1030 比如 1 2 3 7 9 10 11 12 13 14
by Michelle01 @ 2024-02-06 11:08:12
@Michelle01 你试试这组数据
by cancan1030 @ 2024-02-06 11:10:20
@Michelle01 程序运行结果为10(似乎没问题...)
by Michelle01 @ 2024-02-06 11:13:45
@cancan1030 试试这一组 1 2 3 3 1
by cancan1030 @ 2024-02-06 11:18:11
@Michelle01 程序运行结果为3 (嘶...似乎...也没什么问题?)