Codeforces Round #580 (Div. 2) C. Almost Equal

You are given integer n. You have to arrange numbers from 1 to 2n, using each of them exactly once, on the circle, so that the following condition would be satisfied:

For every n consecutive numbers on the circle write their sum on the blackboard. Then any two of written on the blackboard 2n numbers differ not more than by 1.

For example, choose n=3. On the left you can see an example of a valid arrangement: 1+4+5=10, 4+5+2=11, 5+2+3=10, 2+3+6=11, 3+6+1=10, 6+1+4=11, any two numbers differ by at most 1. On the right you can see an invalid arrangement: for example, 5+1+6=12, and 3+2+4=9, 9 and 12 differ more than by 1.
在这里插入图片描述
Input
The first and the only line contain one integer n (1≤n≤105).

Output
If there is no solution, output “NO” in the first line.

If there is a solution, output “YES” in the first line. In the second line output 2n numbers — numbers from 1 to 2n in the order they will stay in the circle. Each number should appear only once. If there are several solutions, you can output any of them.

Examples
inputCopy
3
outputCopy
YES
1 4 5 2 3 6
inputCopy
4
outputCopy
NO
Note
Example from the statement is shown for the first example.

It can be proved that there is no solution in the second example.

题意:题意就是给你一个数n,然后有2n个数(1~2n)围成一个环,然后环中任意n个连续数的和与其它任意n个连续数的和差值小于等于1
思路:通过找规律可以发现(通过题目给你的图),1和2相对,3和4相对,5和6相对,题目中的顺序是 1 4 5 2 3 6,然后将2*n个数分成两组,每组n个数,第一组先分一个1,第二组分个2,然后到3的时候就交叉了,就先分给第二组,然后4 分给第一组,然后到5的时候又先分给第一组,6分给第二组 找到规律后用两个数组存一下分配情况然年输出就行了

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int v[100005],s[100005];
int main()
{
    int n;
    scanf("%d",&n);
    if(n&1)
    {
        printf("YES\n");
        int i=0,j=0,l=1,flog=0;;
        while(l)
        {
            if(flog==0)
            {
                v[i++]=l++;
            }
            else if(flog==1)
            {
                s[j++]=l++;
            }
            else if(flog==2)
            {
                s[j++]=l++;
            }
            else
            {
                v[i++]=l++;
            }
            flog=(flog+1)%4;
            if(l==2*n+1)
            {
                break;
            }
        }
        for(int a=0;a<i;a++)
        {
            printf("%d ",v[a]);
        }
        for(int a=0;a<j;a++)
        {
            printf("%d ",s[a]);
        }
    }
    else
    {
        printf("NO\n");
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值