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;
}
浙公网安备 33010602011771号