例题:给定长度为n的数列整数a0,a1,a2,a3 ..... an-1以及整数S。求出综合不小于S的连续子序列的长度的最小值。如果解不存在,则输出0。
第一组样例 n=10, S = 15, a = {5,1,3,5,10,7,4,9,2,8}。
尺取法步骤:
1.初始化左定点为0.
2.扩充右定点直到满足条件。
3.如果不满足,跳出。
4.将左定点扩大1,回到2条件。
#include <iostream> #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; ll a[100005]; int n; void solve(){ ll s,sum = 0; int t = 0; cin>>s; int cur = 0,ans = n+1; while(1){ while(t<n&&sum<s){ sum += a[t++]; } if(sum < s) break; ans = min(ans,t-cur); sum -= a[cur]; cur++; } if(ans > n) ans = 0; printf("%d ",ans); } int main() { scanf("%d",&n); for(int i = 0; i<n; i++) scanf("%I64d",&a[i]); solve(); return 0; }