CF1358E Are You Fired?(字首和+貪心)
阿新 • • 發佈:2020-08-19
首先,如果k可以,那麼2*k一定可以,因為這是兩個k合併而來,因此如果存在答案,那麼在n/2+1中一定存在答案
對於x分為兩種,當x>=0,那麼f[n]是最優的,只需要判斷一下他即可
對於x<0我們可以嘗試列舉k,首先從最大開始往下,因為k每減小一位,意味著出現了一段字首和,以及之前的最小值減去x。因此只要不停的列舉後判斷最小值是否大於0
減去k的原因是,後面的數字都是x,且我們列舉的長度大於k
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=5e5+10; int a[N]; ll s[N];View Codeint main(){ ios::sync_with_stdio(false); int n; cin>>n; int i; for(i=1;i<=(n+1)/2;i++) cin>>a[i]; int x; cin>>x; for(i=(n+1)/2+1;i<=n;i++){ a[i]=x; } for(i=1;i<=n;i++) s[i]=s[i-1]+a[i]; if(x>=0){ if(s[n]>0){ cout<<n<<endl; } else{ cout<<-1<<endl; } } else{ ll res=1e18; for(i=1;i<=(n+1)/2;i++){ if(i==1){ res=s[n]; } else{ res-=x; res=min(res,s[n]-s[i-1]); } if(res>0){ cout<<n-i+1<<endl; return 0; } } cout<<-1<<endl; } }