A. Lesha and array splitting

VJ传送门:https://vjudge.net/problem/CodeForces-754A

题意:给定一个整数数组,将其拆分成若干子数组,要求如下:

  1. 各个子数组内元素和都不为0
  2. 子数组的各个元素必须保持原数组的顺序
  3. 如果有多种可能,只要求输出其中的一种

思路:先求原数组的前缀和,在分情况讨论:

  1. 所有元素和不为0,这种情况下,1~n,即原数组就满足条件,直接输出即可

所有元素和为0,这种情况下,只要遍历前缀和数组sum,找到满足sum[k]!=0的k,则1~k,k+1~n就是要找的子数组,因为sum[k]!=0,sum[n]=0,则    \small \sum_{i=k+1}^{n} a[i] !=0

代码:

#include<iostream>
using namespace std;

int a[10007], ans[10007];
int main()
{
      int n;
      cin>>n;
      for(int i=1;i<=n;++i){
            cin>>a[i];
            ans[i]+=ans[i-1]+a[i];
      }
            
      if(ans[n]!=0){
            cout<<"YES\n1"<<endl;
            cout<<"1 "<<n<<endl;
            return 0;
      }else{
            for(int i=1;i<=n;++i){
                  if(ans[i]!=0){
                        cout<<"YES\n2"<<endl;
                        cout<<"1 "<<i<<endl;
                        cout<<i+1<<" "<<n<<endl;
                        return 0;
                  }
            }
            cout<<"NO"<<endl;
      }
      return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值