美丽的区间

0.题目

1.题解

1.1 双指针暴力枚举

思路

思路很简单,但是最坏可能 \(O(n^2)\), 导致超时

代码

#include <bits/stdc++.h>
using namespace std;
const int M  = 1e5;
int ans = 0x7FFFFFFF;
int a[M];

int main() {
    int n, S;
    bool flag = false;
    cin >> n >> S;
    for(int i = 0; i < n; i++) {
        cin >> a[i];
    }
    for (int i = 0; i < n; i++) {
        int sum = 0, count = 0;
        for(int j = i; j < n; j++) {
            sum += a[j];
            count++;
            if(count >= ans) break;
            if(sum >= S) {
                ans = min(ans, count);
                flag = true;
                break;
            }
        }
    }
    if(flag) {
        cout << ans;
    } else {
        cout << "0";
    }

    return 0;
}

1.2 滑动窗口(尺取法)

思路

注意到连续区间,大概率会涉及到滑动窗口算法,利用快慢指针的思路,控制窗口不断向右滑动,在大于等于S和小于S之间做判断

代码

#include <bits/stdc++.h>
using namespace std;
const int M  = 1e5;
int ans = 1e5;
int a[M];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n, S;
	cin >> n >> S;
	for(int i = 0; i < n; i++) {
		cin >> a[i];
	}
	
	int sum = 0;
	for (int i = 0, j = 0; i < n;) {
		if(sum < S) {
			sum += a[i];
			i++;
		}
		else{
			ans = min(ans, i - j);
			sum -= a[j];
			j++;
		}
	}

	if(ans == 1e5) cout << 0;
	else cout << ans;
	return 0;
}
posted @ 2024-04-09 16:01  DawnTraveler  阅读(5)  评论(0编辑  收藏  举报