第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

尺取法

標簽:
Html/CSS

尺取法

尺取法核心思路

尺取法其实也是一种模拟,是解决寻找区间和问题的一种方法。

假如有这么一个问题:给你一些数,请在这些数中找到一个区间,使得区间里每一个元素的和大于或等于给定的某个值。

不会尺取法的话,肯定就会开双重循环,枚举区间起点和终点,然后每一次都求一次和,再和给定的数作比较。

尺取法与它的思路类似,都是寻找一个区间的起点和终点。做法是:

用两个指针,最初都指向,这一组数中的第一个,然后如果这个区间的元素之和小于给定的数,就把右指针向右移,直到区间和大于等于给定的值为止。之后把左指针向右移,直到区间和等于给定的值为止,保存方案,继续操作。

假如左指针指向这些数的第一个,并且右指针指向这组数的最后一个,这种情况下的子区间元素之和仍然小于给定的数的话,那么就输出-1,表示不可能。

那么怎么求区间和呢?

当然,for一遍是可以的,但是太浪费时间了。我们可以引入一个累加器,初始值等于这组数中的第一个元素(因为最开始左指针和右指针都指向它),当右指针向右移时,累加器每次就加上右指针指向的元素的值。当左指针向右移时,累加器每次就减去左指针指向的值。

怎么实现呢?

实现

这里有道模板题

poj3061

下面附上代码(不是我写的)

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int a[100000+33];int ans,S,N;void solve(){
    ans=100000+44; 
    int L=1,R=1,sum=0,lsub=0;    while(R<=N)
    {        while(sum<S&&R<=N)//R总指向当前满足要求区间的下一个 注意此处R可能>N 
        {
            sum+=a[R];//累加器加上右指针指向的元素
            ++R;//右指针向右移
            ++lsub;
        }        while(sum>=S)//L总指向当前区间的最左边  左闭右开 
        {
            sum-=a[L];//累加器减去左指针指向的元素的值
            ++L;//左指针右移
            --lsub;
        }
        ans=min(ans,lsub+1);
    }
}int main(){    int T,i,sum;    scanf("%d",&T);    while(T--)
    {        scanf("%d %d",&N,&S);
        sum=0; bool flag=false;        for(i=1;i<=N;++i) 
        {            scanf("%d",&a[i]);
            sum+=a[i];            if(sum>=S&&!flag) flag=true;    
        }        if(!flag)
        {            printf("0\n"); continue;
        }
        solve();        printf("%d\n",ans);
    }    return 0;
}



作者:opbnbjs
链接:https://www.jianshu.com/p/27c0298c4cbf


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優(yōu)惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消