B. Sifid and Strange Subsequences
题目传送门:
题面:
中文题意:
这题目的意思就是说,定义一个序列:
对于
1
≤
i
≤
j
≤
k
1≤i≤j≤k
1≤i≤j≤k
∣
a
i
−
a
j
∣
≥
M
A
X
|a_i-a_j|≥MAX
∣ai−aj∣≥MAX始终成立,其中MAX是序列中最大的数字。
就是问你这序列最长能多长?
思路:
咱捋一捋,
∣
a
i
−
a
j
∣
≥
M
A
X
|a_i-a_j|≥MAX
∣ai−aj∣≥MAX这个条件,首先,如果序列里全是非正数,那100%成立!因为绝对值本身有≥0特点,如果有两个正数那是100%不成立啊,减一下肯定变小了。
于是:
- 序列全是非正数(原序列本就没有正数),简单,直接输出原序列长度n即可;
- 序列包含正数,那就取掉所有非负数,再取一个最小的正数看看会不会影响,可以的话就+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;
}
}
}