前言
因为晚上需要DDL
所以cf基本要鸽掉了只好用来补了DDL冲啊
题意:
就是给你一个数组,
让你找到一个长度合适的子数组(可以不连续)
条件限制
|ai−aj|≥MAX (子数组的最大值),1≤i<j≤k
思路:
首先(负数是必选的):
因为
在子数组全是负数的情况下 负数的绝对值一定是大于等于 MAX的
齐次(0也是必选的):
因为
在子数组只有0的情况下 0-0>=0
在子数组有0和负数的情况下 0作为MAX 一定是成立的
最后(处理正数)
想一想
正数好像只能拿一个
为什么呢
因为如果正数拿两个的话 |正数-正数| >= MAX 是不成立的
所以正数只能拿一个
什么时候能拿一个呢
仔细再想一想
只有最小的差值大于正数的时候才能拿 也就是需要满足|ai-aj|>=MAX (此时MAX是正数)
code:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int a[N];
int n,t;
int main()
{
cin>>t;
while(t -- )
{
cin>>n;
int ans = 0;
int minn = 0x3f3f3f3f;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]<=0)
ans++;
}
sort(a+1,a+1+n);
for(int i=2;i<=n;i++)
if(a[i]<=0)
minn=min(minn,abs(a[i]-a[i-1]));
for(int i=1;i<=n;i++)
{
if(a[i]>0 && a[i]<=minn)
{
ans++;
break;
}
}
cout<<ans<<endl;
//cout<<ans<<"<-----"<<endl;
}
return 0;
}