当前位置: 代码迷 >> 综合 >> LA 2678 Subsequence (训练指南,尺取法)
  详细解决方案

LA 2678 Subsequence (训练指南,尺取法)

热度:73   发布时间:2023-12-13 19:50:38.0

算法竞赛训练指南, 48 页
注意:
1、尺取法,滑动窗口 [L, R] 使得区间内的数的和 大于等于 s , 然后更新最小的区间差值 R - L + 1
2、无解的时候,输出 0

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MaxN = 100010;
int n, s;
int seq[MaxN];void solve()
{
    int ans = n + 1;int sum = 0;int L = 1, R = 1;while(R <= n){
    //不断增加R,使得 sum >= s;while(R <= n && sum < s){
    sum += seq[R++];}if(sum < s)	//一直移动 R 坐标,都找不到 sum >= s 的话,说明此时 所有的最大可能的sum 值 都 小于s, 退出循环{
    break;}ans = min(ans, R - L + 1);//坐标L向右移动,使得 sum < swhile(L < R && sum >= s){
    ans = min(ans, R - L);sum -= seq[L++];	}}printf("%d\n",ans);
}int main()
{
    while(scanf("%d%d", &n, &s) != EOF){
    int sum = 0;for(int i = 1; i <= n; ++i){
    scanf("%d", &seq[i]);sum += seq[i];}if(sum < s){
    printf("0\n");}else{
    solve();}}return 0;
}/* 10 15 5 1 3 5 10 7 4 9 2 8 5 11 1 2 3 4 5 *//* 2 3 */
  相关解决方案