UVa 11039 - Building designing(贪心)

题意

有绝对值不一样的数字,现在把它们从小到大拍起来,相邻的正负必须不同,求最长长度。

思路

贪心。把数组排序一下,第一个必选。然后以后就能选就选。我是用set来判断是否为负数。是就跳过。

代码

 
 
  1. #include <bits/stdc++.h>
  2. #define LL long long
  3. #define lowbit(x) ((x) & (-x))
  4. const int MAXN = 5e5 + 5;
  5. const int INF = 0x3f3f3f3f;
  6. using namespace std;
  7. set<int> mp;
  8. int num[MAXN];
  9. int main()
  10. {
  11. //freopen("input.txt", "r", stdin);
  12. int T, i, j, n, a;
  13. scanf("%d", &T);
  14. while (T--)
  15. {
  16. mp.clear();
  17. scanf("%d", &n);
  18. for (i = 0; i < n; i++)
  19. {
  20. scanf("%d", &a);
  21. if (a < 0)
  22. {
  23. mp.insert(-a);
  24. num[i] = -a;
  25. }
  26. else
  27. num[i] = a;
  28. }
  29. sort(num, num + n);
  30. int cnt = 1, last;
  31. last = mp.count(num[0]) ? -1 : 1;
  32. for (i = 1; i < n; i++)
  33. {
  34. if (last == 1)
  35. {
  36. if (mp.count(num[i]))
  37. last = -1, cnt++;
  38. }
  39. else
  40. if (!mp.count(num[i]))
  41. last = 1, cnt++;
  42. }
  43. printf("%d\n", cnt);
  44. }
  45. return 0;
  46. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值