这题怎么优化啊TLE了

B3628 机器猫斗恶龙

二分
by Katz @ 2023-08-07 11:31:28


可以二分答案
by _O_v_O_ @ 2023-08-07 11:31:48


@[wzc666](/user/678221) 二分
by Argvchs @ 2023-08-07 11:31:55


遍历数组 $a$, 然后维护一个 $sum$,记录 $sum$ 的最小值,最后取 $sum$ 的相反数并 $+1$,最后和 $1$ 取 $\max$。
by Larry76 @ 2023-08-07 11:36:39


谢谢dalao们
by Rtaaa @ 2023-08-07 11:42:29


可以二分。 ```cpp #include <bits/stdc++.h> #define int long long using namespace std; int n,a[100001]; bool check (int k) { for (int i=1;i<=n;i++) { k+=a[i]; if (k<=0) return false; } return true; } signed main () { cin>>n; for (int i=1;i<=n;i++) cin>>a[i]; int r=1,l=n*1000,mid,s; while (r<=l) { mid=(r+l)/2; if (check (mid)) s=mid,l=mid-1; else r=mid+1; } cout<<s<<endl; return 0; } ```
by hhhcj @ 2023-08-12 13:07:25


还有! ``` #include<cstdio> using namespace std; int n,a[10000005],x,ans=1; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } for(int i=1;i<=n;){ if(a[i]>0){ x=a[i]; a[i]=0; while(x>0&&i<=n){ i++; if(a[i]>=0){ x+=a[i]; a[i]=0; } else{ if(x<-a[i]){ a[i]+=x; x=0; } else{ x+=a[i]; a[i]=0; } } } } i++; } for(int i=1;i<=n;i++){ ans-=a[i]; } printf("%d",ans); return 0; } ``````
by ShaunSH @ 2024-07-19 08:04:49


|