排序水题
先按绝对值从小到大排序,立个flag数组对应的负数为1,正数为0,扫一遍flag数组,碰到和前一个元素不同的ans++
如:11 -9 2 5 18 17 -15 4
a 2 4 5 -9 11 -15 17 18
flag 0 0 0 1 0 1 0 0
ans 1 1 1 2 3 4 5 5
#include <iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
//将数组按绝对值快速排序 用冒泡会超时
void quickSort(int *arr, int left, int right){
int i = left, j = right;
int mid = abs(arr[(i+j)/2]);
while(i <= j){
while(abs(arr[i])< mid) i ++;
while(abs(arr[j])> mid) j --;
if(i <= j){
int tmp;
tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
i ++; j --;
}
}
if(i < right) quickSort(arr,i, right);
if(left < j) quickSort(arr,left, j);
}
int main(){
int T,n;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
int a[n],ans=0,flg,flag[n];
memset(flag,0,sizeof(flag));
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
quickSort(a,0,n-1);
//将负数设置为1
for(int i=0;i<n;i++){
if(a[i]<0){
flag[i]=1;
}
}
flg=a[0];
for(int i=0;i<n;i++){
if(flag[i]!=flg){
ans++;
flg=flag[i];
}
}
printf("%d\n",ans);
}
return 0;
}