测试点二 一生之敌

请问测试点二为什么这么诡异,老是过不了😭😭😭😭下面是我的代码。
简单来说就是先把上升的子序列存起来,看能不能两个子序列连接。
或者直接判定可否加一。😭😭 #include<cstdio>
#include<iostream>
#include<algorithm>
#define ll long long
#define db puts("here!")
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=1e5+5;
int a[maxn];
struct node{
    int st,len;
}dp[maxn];
inline int read()
{
    int x=0;
    char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x;
}
int main()
{
    int n,len=0,cnt=0,s=1;
    cin>>n;
    rep(i,1,n)
    {
        a[i]=read();
        if(a[i]>a[i-1])len++;
        else dp[++cnt].st=s,dp[cnt].len=len,len=1,s=i;
        if(i==n)dp[++cnt].st=s,dp[cnt].len=len;
    }
    int ans=0;
    rep(i,1,cnt-1)
        if(dp[i].len+dp[i+1].len>ans)
            if(dp[i+1].len==1)ans=dp[i].len+1;
            else if(a[dp[i+1].st-1]<=a[dp[i+1].st+1]-2)
                ans=dp[i].len+dp[i+1].len;
            else ans=max(ans,dp[i].len+1);
    if(cnt==1)ans=dp[1].len;
	else if(a[dp[cnt].st]>1)ans=max(ans,dp[cnt].len+1);
	else ans=max(ans,dp[cnt].len);
	cout<<ans<<endl;
}
改后代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#define ll long long
#define db puts("here!")
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=1e5+5;
int a[maxn];
struct node{
    int st,len;
}dp[maxn];
inline int read()
{
    int x=0;
    char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x;
}
int main()
{
    int n,len=0,cnt=0,s=1;
    cin>>n;
    rep(i,1,n)
    {
        a[i]=read();
        if(a[i]>a[i-1])len++;
        else dp[++cnt].st=s,dp[cnt].len=len,len=1,s=i;
        if(i==n)dp[++cnt].st=s,dp[cnt].len=len;
    }
    int ans=0;
    rep(i,1,cnt-1)
        if(dp[i].len+dp[i+1].len>ans)
            if(dp[i+1].len==1)ans=dp[i].len+1;
            else if(a[dp[i+1].st-1]<=a[dp[i+1].st+1]-2||a[dp[i+1].st-2]<=a[dp[i+1].st]-2)
                ans=dp[i].len+dp[i+1].len;
            else ans=max(ans,dp[i].len+1);
    if(cnt==1)ans=dp[1].len;
	else if(a[dp[cnt].st]>1)ans=max(ans,dp[cnt].len+1);
	else ans=max(ans,dp[cnt].len);
	cout<<ans<<endl;
}


全部评论
我找到原因了🤣 其实中间判定是否连接少了一步,没有想到可以把上一段尾部数据给改掉。糊涂了😂
1 回复 分享
发布于 2021-02-03 18:11

相关推荐

不愿透露姓名的神秘牛友
07-15 12:20
点赞 评论 收藏
分享
06-17 00:26
门头沟学院 Java
程序员小白条:建议换下项目,智能 AI 旅游推荐平台:https://github.com/luoye6/vue3_tourism_frontend 智能 AI 校园二手交易平台:https://github.com/luoye6/vue3_trade_frontend GPT 智能图书馆:https://github.com/luoye6/Vue_BookManageSystem 选项目要选自己能掌握的,然后最好能自己拓展的,分布式这种尽量别去写,不然你只能背八股文了,另外实习的话要多投,尤其是学历不利的情况下,多找几段实习,最好公司title大一点的
无实习如何秋招上岸
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务