# Codeforces Round #722 B. Sifid and Strange Subsequences

B. Sifid and Strange Subsequences

题目传送门:

题目传送门

题面:

在这里插入图片描述

中文题意:

这题目的意思就是说,定义一个序列:
对于 1 ≤ i ≤ j ≤ k 1≤i≤j≤k 1ijk
∣ a i − a j ∣ ≥ M A X |a_i-a_j|≥MAX aiajMAX始终成立,其中MAX是序列中最大的数字。
就是问你这序列最长能多长?

思路:

咱捋一捋, ∣ a i − a j ∣ ≥ M A X |a_i-a_j|≥MAX aiajMAX这个条件,首先,如果序列里全是非正数,那100%成立!因为绝对值本身有≥0特点,如果有两个正数那是100%不成立啊,减一下肯定变小了。
于是:

  1. 序列全是非正数(原序列本就没有正数),简单,直接输出原序列长度n即可;
  2. 序列包含正数,那就取掉所有非负数,再取一个最小的正数看看会不会影响,可以的话就+1,不可以就同上取法,那个唯一的正数不要也罢。

代码:

记得开ll呜呜呜,wa了几发。


#include<bits/stdc++.h>

typedef long long ll;
using namespace std;
const int maxn=114514;
int a[maxn];
#define INF 0x3f3f3f3f

int main() {
    int t;
    cin >> t;
    while (t--) {
        bool flag1 = 0, flag2 = 0;
        int n;
        cin >> n;
        ll MX ;
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
        sort(a, a + n);
        int pos = 0;
        for (int i = 0; i < n; i++) {
            if (a[i] > 0) {
                flag1 = 1;
                pos = i;
                MX=a[pos];
                break;
            }
        }
        for (int i = 1; i <=pos; i++) {
            if (abs(a[i] - a[i - 1]) < MX) {
                //cout<<a[i]<<" "<<a[i-1]<<endl;
                flag2 = 1;
                break;
            }
        }
      //  cout<<pos<<endl;
    //  cout<<flag1<<" "<<flag2<<endl;
        if (!flag1) {
            cout<<(n)<<endl;

        }
        else{
            if(flag2) cout<<(pos)<<endl;
            else cout<<(pos+1)<<endl;
        }


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值