题意:
有一个2*n的矩阵,里面有数字,让你重新安排数字,使得相邻两个数字之和不能被3整除
可以的话输出YES,否则输出NO
解析:
这道题很简单,就是把0都交替排列
0 0 ...
0 0 0 ...
这样然后1从左边开始排到右边,2从右边开始排到左边
我们总可以调整中间0的位置来使得1,2不相邻
但是这里有一种特殊情况那就是只有2个0的情况
如果只有2个0,并且1,2的个数都是偶数(>0),那么这也是不可能的
1 1 0 2
1 0 2 2
这样1,2的个数只有在奇数的时候才能摆成2行...
这个特判卡了我2,3个小时...
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
ll num[3];
ll n;
int cal()
{
//if(num[0]>n) return 0;
if(num[1]&&num[2]&&num[0]<2) return 0;
if(num[0]>num[1]+num[2]) return 0;
if(num[0]==2&&num[1]%2==0&&num[2]%2==0) return 0;
return 1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
memset(num,0,sizeof(num));
scanf("%lld",&n);
ll tmp;
for(int i=1;i<=n;i++)
{
scanf("%lld",&tmp);num[tmp%3]++;
}
for(int i=1;i<=n;i++)
{
scanf("%lld",&tmp);num[tmp%3]++;
}
int flag=cal();
if(flag) printf("YES\n");
else printf("NO\n");
}
}