码迷,mamicode.com
首页 > 其他好文 > 详细

HDU ACM 2554 N对数的排列问题

时间:2015-04-22 18:11:05      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:c   c++   算法   acm   编程   

题意:有n对数,大小分别为1、2、3、...、n。问是否存在这个样的排列,两个1之间有1个数,两个2之间有2个数,两个3之间有3个数,。。。。。。,两个n之间有n个数,

另外数的次序可以随意。

解法:
1.设k(k=1,2,..,n)放置的第一个位置为ak,第二个位置为bk。则有bk-ak=k+1(ak<bk),则有sum(bk-ak)=2+3+4+...+(n+1)=(1+2+3+...+n)+(1+1+...+1)=n*(n+3)/2。
2.又由于要有2*n个位置来放置这2*n个数。所以sum(ak+bk)=1+2+3+...+2*n=(1+2*n)*(2*n)/2=(1+2*n)*n。
3.sum(ak+bk)=sum(ak+ak+k+1)=sum(2*ak+bk-ak)=2*sum(ak)+sum(bk-ak)=2*sum(ak)+n*(n+1)/2+n。
4.解2和3中的方程可得sum(ak)=n*(3*n-1)/4, sum(bk)=n*(n+1)/4。

分析:

如果要满足题意,只需ak,bk都为整数。方程有解说明有很多排序情况,有些不符合要求,但一定有一组满足要求,我们列式的时候把这种情况也列进去了,有解,说明我们要的这种特殊情况存在。


#include<iostream>
using namespace std;

int main()
{
	int N;

	while(cin>>N &&N)
	{
		if(N%4==0 ||((3*N-1)%4==0 && (N+1)%4==0))
			puts("Y");
		else
			puts("N");
	}
    return 0;
}


HDU ACM 2554 N对数的排列问题

标签:c   c++   算法   acm   编程   

原文地址:http://blog.csdn.net/a809146548/article/details/45197905

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!