题目链接:http://codeforces.com/problemset/problem/300/A
题目意思:给出n个数,将它们分成三批:1、所有数相乘的结果 < 0 2、所有数相乘的结果 > 0; 3、所有数相乘的结果 = 0 还需要满足一个条件:n个数的归属只可以是其中的一批。
由于翻译的时候总是以整个短语来翻,因此一直误以为“product”是“产物”的意思,多谢乌冬兄指点迷津。
不难想到对所有数进行排序,最小的那个数绝对是负数,因此第一批数放1个即可;最大的那个数归到第2批(也是1个),但有个问题,有可能最大的那个数是0,此时第2批要放2两个数(负数),保证相乘是整数,其余放在第3批即可(0和任意一个数相乘都为0),稍稍注意就可以过。
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> using namespace std; const int maxn = 1000 + 10; int a[maxn]; int main() { int n, i, j; while (scanf("%d", &n) != EOF) { for (i = 0; i < n; i++) scanf("%d", &a[i]); sort(a, a+n); printf("1 %d\n", a[0]); if (n == 3) printf("1 %d\n1 %d\n", a[2], a[1]); else { if (a[n-1]) { printf("1 %d\n", a[n-1]); printf("%d ", n-2); } else printf("2 %d %d\n%d ", a[1], a[2], n-3); i = (a[n-1] ? 1 : 3); // 记录第2批数的起始 j = (a[n-1] ? n-1 : n); // 记录第2批数的终点 for ( ; i < j; i++) printf("%d ", a[i]); printf("\n"); } } return 0; }