比较简单吧,题大意为给你一列数,要求你选出其中的一部分,满足绝对值递增并且以一正一负的形式的最长序列。
排序后直接扫一遍就好了。
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=500001;
int a[maxn];
bool cmp(int a,int b)
{
return abs(a)<abs(b);
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n,cmp);
int flag,ans=1;
if(a[0]>0)
flag=1;
else
flag=0;
for(int i=0;i<n;i++)
{
if(flag&&a[i]<0)
{
ans++;
flag=0;
}
else if(!flag&&a[i]>0)
{
ans++;
flag=1;
}
}
printf("%d\n",ans);
}
return 0;
}