• 【积累】求 和不小于K的连续子数组的最短长度/长度不大于M的连续子数组最大和


    杂题:求 和不小于K的连续子数组的最短长度/长度不大于M的连续子数组最大和

    862. 和至少为 K 的最短子数组

    题意:

    给定一个长度为 (n) 的数组 (A)(-10^5leq A_ileq10^5),要求出 和不小于 (K) 的连续子数组的最短长度。

    解:

    无非是双指针,右指针一直往右扫,左指针在适当的时候右移

    (sum=0) 时,设置左指针为当前位置的下一位置;

    (sum>=K) 时,加一些判断,使左指针适当右移。

    之前做过一样的题,但是卡在了左指针右移上,一直处理不好。然后这次遇上了还是不会T^T。看了题解,记下来吧。

    代码:

    #include<bits/stdc++.h>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define mkp(a,b) make_pair(a,b)
    using namespace std;
    const int mod=998244353;
    typedef long long ll;
    const int inf=0x3f3f3f3f;
    const int maxn=1e6+5;
    int n,lim;ll a[maxn];
    int solve()
    {
        int sum=0,st=1,res=inf;
        for(int i=1;i<=n;i++)
        {
            if(a[i]>=lim)return 1;
            sum+=a[i];
            if(sum<=0){
                sum=0;
                st=i+1;
                continue;
            }
            for(int j=i-1;a[j+1]<0;j--){
                a[j]+=a[j+1];
                a[j+1]=0;
            }//!!!!!!!!
            if(sum>=lim){
                while(sum-a[st]>=lim||a[st]<=0)sum-=a[st++];
                res=min(res,i-st+1);
            }
        }
        return res==inf?-1:res;
    }
    int main()
    {
        scanf("%d%d",&n,&lim);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        printf("%d
    ",solve());
    }
    

    P1714 切蛋糕

    题意:

    给定一个长度为 (n) 的数组 (A)(-500leq A_ileq500),要求出 。长度不大于 (M) 的连续子数组的最大和。

    解:

    代码:

    #include<bits/stdc++.h>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define mkp(a,b) make_pair(a,b)
    using namespace std;
    typedef long long ll;
    const int maxn=1e6+2;
    const int mod=1e9+7;
    
    int a[maxn];
    int main()
    {
    	int n,m;
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    	int sum=0,st=1,res=0;
    	for(int i=1;i<=n;i++)
    	{
    		sum+=a[i];
    		if(sum<=0){
    			sum=0;st=i+1;
    			continue;
    		}
    		for(int j=i-1;a[j+1]<0;j--){
    			a[j]+=a[j+1];
    			a[j+1]=0;
    		}
    		while(i-st+1>m||a[st]<=0)sum-=a[st++];
    		res=max(res,sum);
    	}
    	printf("%d
    ",res);
    }
    
  • 相关阅读:
    转】Apache解决高并发和高可用
    Kafka学习(一)配置及简单命令使用
    unity3d教程动态创建简单平面地形
    LeetCode: Unique Binary Search Trees [095]
    德惠也有星巴克
    一个css和js结合的下拉菜单,支持主流浏览器
    【图像处理】人类视觉成像原理
    windows使用nginx+memcached实现负载均衡和session或者缓存共享
    OpenCV基础篇之画图及RNG随机数对象
    在阿里云上布置git server
  • 原文地址:https://www.cnblogs.com/kkkek/p/13690828.html
Copyright © 2020-2023  润新知