UVA_11039
假设当前要放一个blue的floor,那么这个floor的size应当是越大越好的,因为这样做相比于选一个size较小的,至少不会使结果变得更糟。于是接下来的工作只要枚举最下面是放的blue的或者red的,然后向上依次选择颜色交替的、size尽量大的floor即可。
#include<stdio.h> #include<string.h> #include<algorithm> #define MAXN 500010 int N, a[MAXN]; bool cmp(int x, int y) { return std::abs(x) < std::abs(y); } inline int getst(int x) { return x > 0; } void input() { scanf("%d", &N); for(int i = 0; i < N; i ++) scanf("%d", &a[i]); std::sort(a, a + N, cmp); } int deal(int st, int inf) { int cnt = 0; for(int i = N - 1; i >= 0; i --) if(st != getst(a[i]) && std::abs(a[i]) < inf) ++ cnt, inf = std::abs(a[i]), st ^= 1; return cnt; } int main() { int t; scanf("%d", &t); while(t --) { input(); printf("%d\n", std::max(deal(0, 1000000), deal(1, 1000000))); } return 0; }