白书上的例题比较难,认真理解样例代码有助于提高自己
后面的练习题相对简单,独立思考解决问题,增强信心
题意:n个绝对值各不相同的非0整数,选出尽量多的数排成序列,使得该序列正负交错且绝对值递增。
解法:先按绝对值从小到大排序,然后第一个数先入队,然后依次比较后面的数,如果和队尾的数符号相反则入队,直到所有的数遍历完为止
这里用了异或运算,因为这里面没有0,所谓符号相同的两个数异或值为正,不同符号的数异或值为负
1 //#define LOCAL 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 #include <cmath> 6 using namespace std; 7 8 const int maxn = 500000 + 10; 9 int a[maxn]; 10 bool cmp(int a, int b) 11 { 12 return abs(a) < abs(b); 13 } 14 15 int main(void) 16 { 17 #ifdef LOCAL 18 freopen("11039in.txt", "r", stdin); 19 #endif 20 21 int T, n; 22 scanf("%d", &T); 23 while(T--) 24 { 25 scanf("%d", &n); 26 for(int i = 0; i < n; ++i) 27 scanf("%d", &a[i]); 28 sort(a, a+n, cmp); 29 int q = 0, cnt = 1; 30 for(int i = 1; i < n; ++i) 31 if((a[i] ^ a[q]) < 0) 32 { 33 q = i; 34 ++cnt; 35 } 36 printf("%d\n", cnt); 37 } 38 return 0; 39 }