題目大意:有n個絕對值各不相同的非0整數,選出儘量多的整數,排成一個序列,使得正負相交,且絕對值遞增。輸入整數n,輸出最長序列長度。
題目解析:排序+貪心。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define MAX 500010
int a[MAX],b[MAX];
int n;
int cmp(const void *a,const void *b)
{
return *(int *)a - *(int *)b;
}
int vmp(const void *a,const void *b)
{
return *(int *)b-*(int*)a;
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
int i=0,j=0,k=0,w,x,y,c,d,cnt=1;
scanf("%d",&n);
for (k=0;k<n;k++)
{
scanf("%d",&w);
if (w>0)
{
a[i++]=w;
}
else
{
b[j++]=w;
}
}
if (i==0||j==0)
{
printf("1\n");
continue;
}
qsort(a,i,sizeof(int),cmp);
qsort(b,j,sizeof(int),vmp);
y=x=0;
if (a[x]>abs(b[y]))
{
w=b[y++];
}
else
{
w=a[x++];
}
while (x<i&&y<j)
{
//printf("%d ",w);
if (w<0)
{
while (a[x]<abs(w)&&x<i)
{
x++;
}
w=a[x];
if (x!=i)
cnt++;
}
else
{
while (abs(b[y])<w&&y<j)
{
y++;
}
w=b[y];
if (y!=j)
cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}