尺取

尺取法就是形如一把尺子的方法,取一块一块的截取你所需要的序列。
尺取其实也是一种枚举方法,但是有一定的技巧,所以比一般的算法要快很多。

尺取的时间复杂度为O(n)。

尺取的思想:

1.左右端点为0
2.移动右端点直到满足条件,获取区间内的需要信息
3.再向左移动左端点到一定的情况,获取区间内的需要信息
4.如果右端点没有到尽头则回到第二步

举个例子:求n个数中连续的m个数的最大值

#include <stdio.h>
int main()
{
    int n, m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int a[20000];
        for(int i = 0; i < n; i++)
            scanf("%d", a + i);
        int head = 0;
        int tail = 0;
        int sum = 0;
        int ans = 0;
        while(tail < n)
        {
            while(tail - head < m)
            {
                sum += a[tail];
                tail++;
            }
            if(ans < sum)
                ans = sum;
            sum -= a[head];
            head++;
        }
        printf("%d\n",ans);
    }
}

例题

冬日里的一抹暖阳总是能给人们留下深刻的记忆,人们喜爱冬天的太阳,就跟人们喜爱冬天的火锅一般。
寒冷的冬天总会让人想起火锅,最近小Z特别想去吃火锅,刚好某家转转火锅刚开业有活动,有n盘火锅围成一个圈,第一盘和最后一盘是相连的,每一盘火锅都有一个价值a[i],现在可以吃连续的m盘火锅,小Z想知道他所吃的那连续的m盘火锅的最大价值可以是多少?你能帮帮憨憨的小Z吗。

格式

输入格式
第一行数入两个整数n,m(1<=m<=n<=2000000),分别表示火锅的盘数和可以吃的连续的盘数
第二行输入n的数ai,分别表示每一盘火锅的价值

输出格式
输出一个整数,表示连续m盘火锅的最大价值

样例

样例输入
5 3
6 1 2 5 3
样例输出
14

代码实现

#include<stdio.h>
int a[2000005];
int main()
{
    int n, m;
    while(~scanf("%d%d", &n, &m))
    {
        memset(a, 0, sizeof(a));
        int t = 0;
        int tail = 0;
        long long ans = 0;
       	long long sum = 0;
        for(int i = 0; i < n; i++)
            scanf("%d", a + i);
        while(tail != n - 1)
        {
            while(t < m)
            {
                int x = tail + t;
                if(x >= n)
                    x = x % n;
                sum += a[x];
                t++;
            }
            ans = sum > ans ? sum : ans;
            sum -= a[tail];
            tail++;
            t--;
        }
        printf("%lld\n", ans);
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值