题意:水题,有n个绝对值各不相同的非0整数,选出尽量多的数排成一个序列,使得正负号交替且绝对值递增。输出最长序列长度。
方法:先用qsort按照绝对值递增排序,然后判断数组中后一个位置的数是不是和这个数符号相反,是的话加count加1。注意1.count开始为1;2.当n个数全为正或者全为负时输出确实应该是1,当时不确定,AC后确定了。
#define Local
#include <iostream>
#include <iomanip>
#include <string>
#include <cstring>
#include <cstdio>
#include <queue>
#include <stack>
#include <algorithm>
#include <cmath>
using namespace std;
#define MAX 500000
int num[MAX];
int cmp(const void *a, const void *b)
{
int m = abs(*(int *)a), n = abs(*(int *)b);
return m - n;
}
int main()
{
#ifdef Local
freopen("a.in", "r", stdin);
freopen("a.out", "w", stdout);
#endif
int t = 0, n = 0;
cin >> t;
while (t--)
{
int count = 1;
memset(num, 0, sizeof(num));
cin >> n;
int i = 0;
for (i = 0; i < n; i++)
cin >> num[i];
qsort(num, n, sizeof(num[0]), cmp);
for (i = 0; i < n-1; i++)
{
if (num[i] < 0 && num[i+1] > 0)
count++;
else if (num[i] > 0 && num[i+1] < 0)
count++;
}
cout << count << endl;
}
}