UVa 11039 (排序+贪心) Building designing

白书上的例题比较难,认真理解样例代码有助于提高自己

后面的练习题相对简单,独立思考解决问题,增强信心

题意: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
", cnt);
37     }
38     return 0;
39 }
代码君
原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/3936019.html