题意:
给定一个2 * n的矩阵, 和 2 * n 个数, 问能不能通过重排列, 使得任意相邻两数不能被3整除
分析:
这题一直卡到最后, 赛后经对面大佬提醒后, 发现统计所有数模三的结果(0,1,2三种), 然后考虑怎么去“构造”符合这样的矩阵就行。
本地只过了用例和一些小数据, 等一个重现赛。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 10000 + 7; 4 int n; 5 int num[maxn*2]; 6 int _0,_1,_2; 7 bool judge() 8 { 9 if(_0 > n)//_0会有相邻 10 return false; 11 12 if(_1 == 0 || _2 == 0) // 只有1, 2其中一种, 不用分割 13 return true; 14 15 if(_0 <= 1)//有1, 2两种而且不形成分割 16 return false; 17 18 if(_0 == n) 19 return true; 20 if(_0 % 2 == 0) 21 /* _0偶数情况, 形成|* 2 2 2| 22 |1 * 2 2|可以隔出奇数个位置 */ 23 { 24 if(_1 % 2 == 0 || _2 % 2 == 0)//偶数个位置不能被隔开 25 return false; 26 27 return true; 28 } 29 else 30 /* _0奇数情况, 形成|* & * 2| 31 |1 * 2 2|至少有(_0 - 2)个围住位置(&)可以任选, 所以奇偶都行*/ 32 { 33 34 return true; 35 } 36 } 37 int main() 38 { 39 // freopen("data.txt","r", stdin); 40 int T; 41 scanf("%d", &T); 42 while(T--) 43 { 44 scanf("%d", &n); 45 _0 = _1 = _2 = 0; 46 for(int i = 0; i < 2*n; i++) 47 { 48 scanf("%d", &num[i]); 49 if(num[i] % 3 == 0) _0++; 50 else if(num[i] % 3 == 1) _1++; 51 else _2++; 52 } 53 // printf("%d %d %d ", _0, _1, _2); 54 printf("%s ", judge()? "YES":"NO"); 55 } 56 return 0; 57 }