Codeforces Round #722 (Div. 2) B. Sifid and Strange Subsequences
题目链接
题目大意:给定你n个数,让你求一个最长子序列满足其中任意两个数的绝对差,均大于该子序列的最大值;
思路:贪心,该子序列最多只能有一个正数,并且判断0的个数;
第一种情况:0的个数小于等于1,此时允许正数存在,所以查找距离非正数最近的哪一个数,并且判断之后是否存在两个数的的绝对差小于该整数,如果存在则删除该正数。
第二种情况:0的个数大于1,此时不能存在正数,所以只需求小于等于0的个数,即为答案;
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<queue>
#include<stack>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
const int N=1e5+10;
int a[N];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n;
int ans;
scanf("%d",&n);
int sum=0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
if(a[i]==0){
sum++;
}
}
sort(a,a+n);
if(sum<=1){
for(int i=n-1;i>=0;i--){
if(a[i-1]<=0){
ans=i+1;
for(int j=i;j>=1;j--){
if(a[j]-a[j-1]<a[i]){
ans--;
break;
}
}
break;
}
}
}
else{
for(int i=n-1;i>=0;i--){
if(a[i]==0){
ans=i+1;
break;
}
}
}
printf("%d\n",ans);
}
}