uva 11039 - Building designing(贪心)

来源:互联网 发布:linux配置lamp 编辑:程序博客网 时间:2024/05/07 17:35

题目大意:给出n个数,均为非0数,要求选出尽量多的数组成序列,序列要求正负交替,绝对值递增。


解题思路:读入时将正数与负数分别储存在两个数组,负数可以直接储存绝对值。然后将两个数组按照绝对大小分别排序,然后在两个数组中交替选出尽量小的数,满足绝对值大于前面一个选出的数。


#include <cstdio>#include <algorithm>#include <cmath>using namespace std;int cmp(int a, int b) {return abs(a) < abs(b);}int main() {int T, A[500010];scanf("%d", &T);while (T--) {int n;scanf("%d", &n);for (int i = 0; i < n; i++)scanf("%d", &A[i]);sort(A, A + n, cmp);int tmp = -A[0], cnt = 0;for (int i = 0; i < n; i++) {if (A[i] * tmp  < 0) {tmp = -tmp;cnt++;}}printf("%d\n", cnt);}return 0;}


0 0