题解 P6470 【[COCI2008-2009#6]CUSKIJA】
题面传送门。
题意简述:给定一个序列
a ,求出是否有一种排列满足相邻两数之和不是3 的倍数。
一些约定:我们设
- 序列
x 为a 中除三余0 的数。 - 序列
y 为a 中除三余1 的数。 - 序列
z 为a 中除三余2 的数。 -
首先判断无解。
Case
有
Case
如果
接下来考虑构造。构造方法如下:
首先输出所有除三余
- 为什么是
|x|>1 ?因为除三余1 的数和除三余2 的数之间要有一个除三余0 的数隔开来。
接着输出所有除三余
最后可能还剩下一个除三余
vector <int> b[3];
#define x b[0].size()
#define y b[1].size()
#define z b[2].size()
#define work cout<<b[0].back()<<" ",b[0].pop_back()
int main(){
int n=read(),a;
for(int i=1;i<=n;i++)a=read(),b[a%3].pb(a);
if(y+z+1<x||y&&z&&!x)puts("No"),exit(0);
puts("Yes");
for(auto i:b[1]){if(x>1)work; cout<<i<<" ";}
for(auto i:b[2]){if(x)work; cout<<i<<" ";}
if(x)work;
return 0;
}