alice132

 

2026.1.10 作业 - # P14063 [PO Final 2022] 海滩 / Badstrand

题目描述

Maja 厌倦了海岸被大湖占据,她想要修建一个又长又漂亮的公用海滩。现在,她计划买下海岸边的一块土地来建造海滩。

Maja 预算为 \(B\) 克朗。有 \(N\) 块土地,从西往东的价格依次为 \(A_1,A_2,\cdots,A_N\) 克朗。Maja 想要知道,她能够买下的最长的一段连续的土地是多长。

输入格式

第一行包含两个整数:\(1 \le N \le 10^5\)\(0 \le B \le 10^9\),分别表示地块的数量和 Maja 的预算。

第二行包含 \(N\) 个正整数 \(A_1, A_2, \ldots, A_N\),其中 \(A_i\) 是第 \(i\) 个地块的价格,\(1 \le A_i \le 1000\)

输出格式

输出一个整数:即 Maja 能够买下的最长的一段连续的土地的长度。

输入输出样例 #1

输入 #1

3 14
4 7 3

输出 #1

3

输入输出样例 #2

输入 #2

4 36
11 5 7 14

输出 #2

3

输入输出样例 #3

输入 #3

9 18
1 5 3 4 6 2 1 2 4

输出 #3

6

说明/提示

子任务

本题采用捆绑测试。

子任务编号 得分 限制
\(1\) \(20\) \(N \le 500\) 且所有 \(A_i\) 具有相同的值。
\(2\) \(30\) \(N \le 500\)
\(3\) \(50\) \(N \le 10^5\)

题解

已知长度为 \(n\) 的序列 \(\{a_i\}\) ,求满足 \(\sum{a_i} <= b , l \le i \le r\) 区间长度的最大值。

方法一:枚举区间 \([l,r]\) ,统计满足 \(sum[r]-sum[l-1] \le b\)\(r-l+1\)最大值。效率为 \(O(n^2)\)

方法二:枚举左端点 \(l_i\) , 求满足区间和小于等于 \(b\) 的最大 \(r_i\)\(r_i\) 具有单调性,用双指针维护 \(l_i,r_i\)。 算法效率为 \(O(n)\)

#include <iostream>
using namespace std;
int  n,b,a[100002];
int main() {
    cin>>n>>b;
    for (int i=1;i<=n;i++) cin>>a[i];
    int R=0;int sum=0,Ans=0;
    for (int L=1;L<=n;L++) {
        while (R+1<=n && sum+a[R+1]<=b) R++,sum+=a[R];
        Ans=max(Ans,R-L+1);
        sum-=a[L];
    }
    cout<<Ans<<endl;
    return 0;
}

posted on 2026-01-20 21:19  alice_ss  阅读(2)  评论(0)    收藏  举报

导航