ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

codeforces 1205A Almost Equal

2019-08-19 16:01:04  阅读:647  来源: 互联网

标签:1205A YES Almost codeforces int numbers output 2n example


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
input

3

output

YES
1 4 5 2 3 6

input

4

output

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个连续的点的记录下来。其中这些数要求只有2个数字构成,并且这两个数必须连续。没有为NO, 有的则输出YES 和方案。

题解:

每个点会在n个环上,所以所有环的总和为sum = (1 + 2 + … + 2 * n) * n.
一共有2n个环所以两个不同和的环的和(有点绕)为rsum = sum / n, 即为rsum = (1 + 2 + … 2 * n).
所以rsum 是偶数时,则无法分为两个连续的自然数。无解。
当rsum是奇数时,有解。
模拟填即可。
怎么填?
我们可以这样:

1

2
然后构造
1的左边从上往下填,1的右边从下往上填。
右下填3,
依次左边填2个,右边填2个(最后一次一个),填满即可。

代码如下:
#include <iostream>
#include <cstring>
using namespace std;
int a[200005];
int main(){
	int n;
	scanf("%d", &n);
	int m = 2 * n;
	long long r = (1 + m) * m / 2;
	if(r % 2 == 0){
		printf("NO\n");
		return 0;
	}
	printf("YES\n");
	a[1] = 1;
	a[n + 1] = 2;
	int q = 1, h = n + 2;
	a[n + 2] = 3;
	a[2 * n] = 2 * n;
	int now = 4;
	while(q + 2 <= n || h + 2 < 2 * n){
		if(q + 2 <= n){
			a[++q] = now++;
			a[++q] = now++;
		}
		if(h + 2 < 2 * n){
			a[++h] = now++;
			a[++h] = now++;
		}
	}
	for(int i = 1; i < 2 * n; i++){
		printf("%d ", a[i]);
	}
	printf("%d\n", a[2 * n]); 
	return 0; 
} 

标签:1205A,YES,Almost,codeforces,int,numbers,output,2n,example
来源: https://blog.csdn.net/linwenqidbk/article/details/99730027

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有