1.24每日一题
学到了快读
学到了双指针控制
这个题目的边界问题值得注意
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); }
有机会尝试用前缀和解决一下;
浙公网安备 33010602011771号