臭道人

1.24每日一题

学到了快读

https://blog.csdn.net/hualian_/article/details/95329939?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control

学到了双指针控制

这个题目的边界问题值得注意

https://ac.nowcoder.com/acm/problem/217545

我初次尝试下:

①关同步,最后一个节点过不了,需要使用快读.

这里的快读快写有局限性,因为题干给了 都是正整数 一般的快读快写还需要处理出现"-"(负号)的情况.

②我写的代码有一定的漏洞,比如

输入9 9
1 2 3 4 0 0 0 0 0 0 0 0检查到4以后从4往后读了,就忽略了[2 3 4]段

这是我经常犯下的问题,在查找子串中也是这个问题.

③一个可以ac的代码,或许需要多次提交才能ac,每次判题的时候性能会浮动,性能最差的时候可能会tle.

#include<iostream>
#include<cctype>
using namespace std;
#define ll long long 
ll num[20000010];
ll in()
{
    ll a=0;char ch=0;
    while(!isdigit(ch))
        ch=getchar();
    while(isdigit(ch))
        a=a*10+ch-48,ch=getchar();
    return a;
}
inline void out(ll n)
{
    if(n>=10)
        out(n/10);
    putchar(n%10+48);
}
int main()
{
    int n=in();
    ll k=in(),sum=0,ans=-1,r=1,l=1;
    while(r<=n)
    {
        num[r]=in();
        sum+=num[r];
        if(sum==k)
            ans=max(ans,r-l+1);
        r++;
        while(sum>k&&r>=l)
            sum-=num[l],l++;
        if(sum==k)
            ans=max(ans,r-l);//为什么这里没有像上面那样+1呢
            //边界问题,因为在l结束后已经加了1了. 
    }
    if(ans==-1)puts("-1");
    else out(ans);
}    

有机会尝试用前缀和解决一下;

 

posted on 2021-01-24 22:55  臭总  阅读(46)  评论(0)    收藏  举报

导航