题目链接

https://nanti.jisuanke.com/t/19976

题意

给出 一个n 然后 给出 2*n 个数

可以重新排列成两行 然后 相邻的两个数 加起来 不能被三整除

可以上下相邻 也可以 左右相邻

思路

因为相加 根据同余定理 我们可以先把 每个数 模3

因为 可以重新排列 那么我们不妨 以最优的方式去排 看能不能得到 YES

很显然 , 0 和 0 1 和 2 不能放在一起

也就是说

0 要摆放的话 肯定是错位摆放的 比如这样

星号 表示 空位 那么很显然 0 的个数不能超过 n

那么我们可以知道 因为 1 和 2 不能在一起

那么 可以是这样

用 两个 0 形成一条分界线 上面放1 下面放2

然后可以知道 如果 只有两个 0 的话 那么很显然 只有当 1的个数 是奇数 并且 2 的个数 是偶数 才是成立的

还有一个比较显然的是

假如 只有1 或者 只有2 的话 那么在满足 0的个数 < n的情况下 是恒成立的

那么很显然 如果0 的个数 <= 1 并且同时存在 1 和 2 的话 那么 肯定存在至少一对(1, 2) 相邻

那只需要讨论 0 的个数 > 3 的情况了

先 讨论 0 的个数 == 3 的情况 如果 0 的个数 == 3 那么 就可以多出一个0 去弥补 空位

也就是说 可以存在 奇数1 偶数2 或者 奇数2 偶数1 的情况

那么也就是说 偶数1 偶数2 是不可行的

但实际上 不会存在这种情况 因为这种情况是 一奇两偶 相加是奇数 易知 数字总个数是2*n 必然为偶数

所以这种情况 不用考虑 也就是说 0的个数 == 3 并且 < n 的时候 是恒成立的

很显然 当0的个数 >= 4的时候 也满足

AC代码

#pragma comment(linker, "/STACK:102400000,102400000")

#include <cstdio>
#include <cstring>
#include <ctype.h>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <map>
#include <stack>
#include <set>
#include <list>
#include <numeric>
#include <sstream>
#include <iomanip>
#include <limits> #define pb push_back
#define fi first
#define se second
#define L(on) ((on)<<1)
#define R(on) (L(on) | 1)
#define mkp(a, b) make_pair(a, b)
#define bug puts("***bug***");
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define CLR(a, b) memset(a, (b), sizeof(a));
#define syn_close ios::sync_with_stdio(false); cin.tie(0);
#define sp system("pause");
//#define gets gets_s using namespace std; typedef long long ll;
typedef long double ld;
typedef long double ld;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef vector <int> vi;
typedef vector <ll> vll;
typedef vector < vi > vvi; const double PI = acos(-1.0);
const double EI = exp(1.0);
const double eps = 1e-8; inline int read()
{
char c = getchar(); int ans = 0, vis = 1;
while (c < '0' || c > '9') { if (c == '-') vis = -vis; c = getchar(); }
while (c >= '0' && c <= '9') { ans = ans * 10 + c - '0'; c = getchar(); }
return ans * vis;
} const int INF = 0x3f3f3f3f;
const ll INFLL = 0x3f3f3f3f3f3f3f3fll;
const int maxn = (int)1e2 + 10;
const int MAXN = (int)1e4 + 10;
const ll MOD = (ll)1e9 + 7; int n;
int arr[3]; void input()
{
n = read();
CLR(arr, 0);
for (int i = 0; i < 2 * n; i++)
arr[read() % 3]++;
} bool solve()
{
if (arr[0] > n) return false;
if (arr[0] <= 1 && arr[1] && arr[2]) return false;
if (arr[0] == 2 && (arr[1] % 2 == 0) && (arr[2] % 2 == 0)) return false;
return true;
} int main()
{
int t = read();
while (t--)
{
input();
puts(solve() ? "YES" : "NO");
}
}

17南宁区域赛 J - Rearrangement 【规律】的更多相关文章

  1. 17 南宁区域赛 F - The Chosen One 【规律】

    题目链接 https://nanti.jisuanke.com/t/19972 题意 给出一个n 然后将 n 个数 标号为 1 -> n 按顺序排列 每次抽掉 奇数位的数 然后求最后剩下那个数字 ...

  2. 17南宁区域赛 I - Rake It In 【DFS】

    题目链接 https://nanti.jisuanke.com/t/19975 题意 Alice 和 Bob 玩游戏 在一个4x4 的方格上 每个人 每次选择2x2的区域 将里面的四个值求和加到最后的 ...

  3. The Maximum Unreachable Node Set 【17南宁区域赛】 【二分匹配】

    题目链接 https://nanti.jisuanke.com/t/19979 题意 给出n个点 m 条边 求选出最大的点数使得这个点集之间 任意两点不可达 题目中给的边是有向边 思路 这道题 实际上 ...

  4. 高精度乘法-17南宁区域赛F -The Chosen One

    题目大意:给你一个n,然后从1~n隔一个选一个,挑出一个集合然后从集合中继续隔一个挑一个,直到只有一个数,问最后一个数是多少?2<=n<=1050 例如n=5,先选出2,4最后选择4.n= ...

  5. 2017acm南宁现场赛 J题 Rearrangement

    题意: 给定一个2 * n的矩阵, 和 2 * n 个数, 问能不能通过重排列, 使得任意相邻两数不能被3整除 分析: 这题一直卡到最后, 赛后经对面大佬提醒后, 发现统计所有数模三的结果(0,1,2 ...

  6. luogu 1327 数列排序 & 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 J题 循环节

    luogu 1327 数列排序 题意 给定一个数列\(\{an\}\),这个数列满足\(ai≠aj(i≠j)\),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? ...

  7. 2014年亚洲区域赛北京赛区现场赛A,D,H,I,K题解(hdu5112,5115,5119,5220,5122)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 下午在HDU上打了一下今年北京区域赛的重现,过了5题,看来单挑只能拿拿铜牌,呜呜. ...

  8. 2019 ICPC 上海区域赛总结

    2019上海区域赛现场赛总结 补题情况(以下通过率为牛客提交): 题号 标题 已通过代码 通过率 我的状态 A Mr. Panda and Dominoes 点击查看 5/29 未通过 B Prefi ...

  9. HDU5558 Alice's Classified Message(合肥区域赛 后缀数组)

    当初合肥区域赛的题(现场赛改了数据范围就暴力过了),可惜当初后缀数组算法的名字都没听过,现在重做下. i从1到n - 1,每次枚举rank[i]附近的排名,并记录当起点小于i时的LCP(rank[i] ...

随机推荐

  1. IOS开发之ZBarReaderView的使用

    IOS开发之ZBarReaderView的使用 HOMEABOUTGUESTBOOKCATEGORIESTAGSLINKSSUBSCRIBE 当开发IOS程序中需要用到二维码识别功能的时候,zbar这 ...

  2. NSCondition(转)

    NSConditionLock 继承类NSObject 遵从的协议NSLocking NSObject NSConditionLock 类定义特定的.用户定义的条件锁 协议NSLocking 方法 l ...

  3. csla 与高cpu

    在项目中一直使用csla 4.13. 项目一直正常,但是偶尔会出现iis占用的cpu 突然100%, 后面客户量大的情况,加入了缓存的机制.100%的情况出现的更多了. 当时有数据库死锁的原因.cpu ...

  4. Ordering Tasks UVA - 10305 图的拓扑排序

    John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...

  5. Android.mk解析

    https://developer.android.com/ndk/guides/android_mk.html#over LOCAL_STATIC_LIBRARIES PREBUILT_STATIC ...

  6. 通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML。

    通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML. JavaScript 能够改变页面中的所有 HTML 元素 JavaScript 能够改变页面中的所有 HTML ...

  7. CI的意思

    Continuous integration (CI) is the practice, in software engineering, of merging all developer worki ...

  8. point-position2修改版

    说明: 在共面直线测试中,由于计算误差等原因,共面条件判断不准,但计算结果依然正确. // point-position2.cpp : 定义控制台应用程序的入口点. #include "st ...

  9. 调用opencv时,使用Egien工具出现“error C2061: 语法错误: 标识符“Matrix””和“error C2653: “Eigen”:不是类或命名空间名称”该如何解决?

    这个问题主要是由于头文件的编译问题引起的. 1.如果没有Eigen工具的,先下载Egien工具并配置. Egien可以去主页下载.配置时,打开你的c++工程属性页:配置属性->C/C++-> ...

  10. PhotoSwipe异步动态加载图片

    在开发搜房家居M站的时候,搜房家居装修效果图相册展示效果需要用到PhotoSwipe插件来显示图片.特点:1. 家居提供的接口,每次只能获取一张图片2. 装修效果图的张数不限.3. 从PhotoSwi ...