hdu 5783——Divide the Sequence

朴灿烈づ我的快乐病毒、 2022-07-19 01:12 228阅读 0赞

题意及思路:

求一个序列的分段个数,使得每一段的前缀和为0,如果正向思维,那么解法是从前往后遍历,每遇到一个负数就向前遍历直到>=0(这样贪心保证了序列尽可能多),但是这样最坏的情况是n^2的,所以要逆过来来考虑,每遇到负数就向前加到>=0即可,然后边统计答案,在n的算法里计算出。(注意:前缀和可能超int,用long long 保存)

code:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N=1e6+6;
  5. ll v[N];
  6. int main()
  7. {
  8. int n;
  9. while (~scanf("%d",&n)){
  10. for (int i=0;i<n;i++) scanf("%lld",v+i);
  11. ll s=0,ans=0;
  12. for (int i=n-1;i>=0;i--){
  13. s+=v[i];
  14. if (s>=0) {ans++;s=0;}
  15. }
  16. cout<<ans<<endl;
  17. }
  18. }

发表评论

表情:
评论列表 (有 0 条评论,228人围观)

还没有评论,来说两句吧...

相关阅读