样例过了但才40,求调

B3637 最长上升子序列

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 (嘶...似乎...也没什么问题?)


上一页 | 下一页