子段和--牛客

子段和–(牛客)

https://ac.nowcoder.com/acm/problem/232994

给定一个序列,问你有没有可能重新排列这个序列使得所有长度小于等于 2 的子区间和不等于0。
思路:

  • 既然是长度小于等于2的子区间,那么首先需要判断序列里面有没有0,如果有的话就一定是NO
  • 根据样例2可以知道,然后这个序列只有两种数,并且互为相反数那么就只能输出NO了
  • 如果仅仅只有两个数互为相反数,并且n>2,那么就可以给它隔开
  • 那么就是先进行排序,这样一来正数和负数就分开了,如果这个时候仅仅判断a[i]+a[i-1]==0是不行的,假设为-9 -2 2 4,这是排序好的,它是可以进行隔开的,所有需要进行更改,那就是2的情况了
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxLine = 5e5;
int a[maxLine],b[maxLine],c[maxLine];
void solve(){
	int n;
    cin>>n;
    int ans=0;
    for(int i=0;i<n;i++){
        cin>>a[i];
        if(a[i]==0){//判断里面有没有0
            cout<<"NO";
            return ; 
        }
    }
    sort(a,a+n);//从小到大排序
    for(int i=0;i<n;i++){
        if(i==0||a[i]!=a[i-1]){//判断序列里面有几种数字
            ans++;
        }
    }
    if(ans==2&&a[0]+a[n-1]==0){//如果只有两种,并且互为相反数那就输出NO
        cout<<"NO";
    }
    else{
        cout<<"YES";
    }
}
signed main(){
	ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
	int T=1;
	//cin>>T;
	while(T--){
		solve();
	}
	
	return 0;
}
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值