题意分析:给定n个数(n为3的倍数)均在1~6之间,是否能将其三个一组分成n/3组,且满足a < b < c; a dividesb, b dividesc.
若能将其输出,不能则输出-1。1~6之间能满足连续整除关系的只有1 2 4;1 2 6; 1 3 6;只需要统计各个数字出现的数
量然后判断其数量关系即可,其中5 7必定不能出现,1出现的次数最多。自己当时错在判断条件错了,当时想得太简单,
只写了一个判断条件if(ans[1] == ans[2] + ans[3] && ans[1] == ans[4] + ans[6])这种情况对于1 2 3 4 6均出现的条件是满足
的,但是其他条件却不一定成立。
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int n,m;
int ans[15];
int num = 0,flag = 1;
scanf("%d",&n);
memset(ans, 0, sizeof(ans));
for(int i = 0; i < n; i++)
{
scanf("%d",&m);
ans[m] += 1;
if(ans[m] == 1)
num++;
if(m == 5 || m == 7)
flag = 0;
}
bool ok = true;
if(num < 3 || !flag) //出现的数字少于三个或者出现5或7则必定不能成功分组
ok = false; // 1 2 4
int a3 = ans[3], a4 = ans[4]; // 1 2 6
if(ans[1] < ans[3] || ans[6] < ans[3]) // 1 3 6
ok = false;
ans[1] -= ans[3]; ans[6] -= ans[3];
if(ans[1] != ans[2] || ans[6] + ans[4] != ans[2]) ok = false;
int a6 = ans[6];
if(ok)
{
while(a3--) printf("1 3 6\n");
while(a4--) printf("1 2 4\n");
while(a6--) printf("1 2 6\n");
}
else
printf("-1\n");
return 0;
}