poj 3061 技巧

第一種方法 因爲是遞增序列 對於任何一個sum [i] 在 i到n之間二分找一下就可以了

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <iostream>
#include <sstream>
#include <ostream>
#include <algorithm>
#include <ctype.h>
#include <cmath>
#include <queue>
#include <vector>
#define inf 1e9+7
#define pi acos(-1)
#define natrule exp(1)
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
int arr[200000];
int sum[200000];
int main(){
    int t;
    cin>>t;
    while(t--){
        int n,kk;
        cin>>n>>kk;
        for(int i=1;i<=n;i++){
            cin>>arr[i];
            sum[i]=arr[i]+sum[i-1];
        }
        int res=inf;
        for(int i=1;sum[i]+kk<=sum[n];i++){
            int len=(int)(lower_bound(sum+i,sum+n+1,sum[i]+kk)-sum-i);
            res=min(res,len);
        }
        if(res==inf) cout<<0<<endl;
        else
        cout<<res<<endl;
    }
    return 0;
}

第二種方法 :尺取 (看的挑戰 )

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <iostream>
#include <sstream>
#include <ostream>
#include <algorithm>
#include <ctype.h>
#include <cmath>
#include <queue>
#include <vector>
#define inf 1e9+7
#define pi acos(-1)
#define natrule exp(1)
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
int arr[200000];
int sum[200000];
int main(){
    int t;
    cin>>t;
    while(t--)
    {
        int n,kk;
        cin>>n>>kk;
        for(int i=0;i<n;i++)
        {
            cin>>arr[i];
        }
        int res=inf;
        int s,end,all;
        s=end=all=0;
        for(;;)
        {
            while(end<n&&all<kk)
            {
                all+=arr[end++];
            }
            if(all<kk) break;
            res=min(res,end-s);
            all-=arr[s++];
        }
        if(res==inf) cout<<0<<endl;
        else cout<<res<<endl;
    }
    return 0;
}

tips 對於區間上的操作最好是左閉右開從零開始 stl也是這個樣子實現


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章