题目链接:CF1205A
标签:构造、贪心、数学
大意:输入n,构造一个长度为2n的环(由数字1~2n组成),确保任意连续的n个数之和仅有两种可能且相差不大于1(为连续自然数)
思路:
比赛的时候误认为是连续三个数死活没想到思路,重新看一遍题之后发现并不是太难。
把1~2n个数分为2组,这两组应该为连续的自然数,(若为相等的数必不可能满足任意n个连续的数之和仅有两种可能,但笔者水平有限无法给出合理的证明),因此n为偶数时无解。
下面讲讲如何模拟,1和2n必定是在同一组。那2就是在(1+n)的位置(1的对位),2n-1与2n同理。从1开始填,下面的数依次+3、+1,顺便填上对位,填满即可。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn=200005;
int a[maxn];
int d[2];
int main()
{
d[0]=3;
d[1]=1;
int now=0;
int n;cin>>n;
a[1]=1;a[n+1]=2;
if(n%2){cout<<"YES"<<endl;
for(int i=2;i<=n;i++,now^=1) {
a[i]=a[i-1]+d[now];
if(a[i]%2)
a[i+n]=a[i]+1;
else
a[i+n]=a[i]-1;
}
for(int i=1;i<=2*n;i++)
cout<<a[i]<<" ";}
else{
cout<<"NO"<<endl;
}
}