1 条题解

  • 0
    @ 2025-10-8 16:54:34

    300ms 解法

    #include<bits/stdc++.h>
    //这是300ms的代码
    using namespace std;
     
    struct node{int l, r;}s[500010];
    //按灭鼠范围的左边界由小到大排序,相同则按右边界由小到大排序 
    bool cmp(node s1, node s2){if(s1.l!=s2.l) return s1.l<s2.l;else return s1.r<s2.r;}
    int main()
    {
        int n;scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            int a;scanf("%d",&a);
            s[i].l=max(i-a,1);
            s[i].r=min(i+a,n);
        }
        sort(s+1,s+n+1,cmp);
        int cnt=0, now=0, i=1; 
        while(now<n)//本次搜索时,1~now的老鼠已经被消灭
        {
            int maxr=0;//maxr 记录最远的右边界 
            while(s[i].l<=now+1&&i<=n)
            {
                if(s[i].r>maxr) maxr=s[i].r;
                i++;
            }
            now=maxr;
            cnt++;
        }
        printf("%d\n",cnt);
        return 0;
    }
    

    60ms 优化解法

    #include<bits/stdc++.h>
    //这是60ms的代码
    using namespace std;
    const int N=500005;
    int a[N],n,dp[N];
    int main()
    {
        int t;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]),t=max(i-a[i],1),dp[t]=max(dp[t],i+a[i]);
        for(int i=1;i<=n;i++) dp[i]=max(dp[i],dp[i-1]);
        int ans=0,i=0,lim=dp[1];
        while(i<n)
        {
            i=lim;
            lim=dp[i+1];
            ans++;
        }
        printf("%d\n",ans);
        return 0;
    }
    
    • 1

    信息

    ID
    873
    时间
    1000ms
    内存
    128MiB
    难度
    6
    标签
    递交数
    133
    已通过
    43
    上传者