zoukankan      html  css  js  c++  java
  • HDU 2554 N对数的排列问题 ( 数学 )

    题目链接

    Problem Description

    有N对双胞胎,他们的年龄分别是1,2,3,……,N岁,他们手拉手排成一队到野外去玩,要经过一根独木桥,为了安全起见,要求年龄大的和年龄小的排在一起,好让年龄大的保护年龄小的,然后从头到尾,每个人报告自己的年龄,就得到了一个年龄的序列。比如有4对双胞胎,他们报出来的年龄序列是:41312432。突然,他们中间最聪明的小明发现了一个有趣的现象,原来,这个年龄序列有一个规律,两个1中间有1个数,两个2中间有2个数,两个3中间有3个数,两个4中间有4个数。但是,如果是2对双胞胎,那么无论他们怎么排年龄序列,都不能满足这个规律。

    你的任务是,对于给定的N对双胞胎,是否有一个年龄序列,满足这一规律,如果是,就输出Y,如果没有,输出N。

    Input

    共有若干行,每行一个正整数N<100000,表示双胞胎的数量;如果N=0,表示结束。

    Output

    共有若干行,每行一个正整数,表示对应输入行是否有一个年龄序列,满足这一规律,如果是,就输出Y,如果没有,输出N

    Sample Input

    4
    2
    1309
    0
    

    Sample Output

    Y
    N
    N
    

    分析:

    这题可以这样来抽象:

    n对数,大小为1、2、3、...、n。现要求两个1之间有1个数,两个2之间有2个数,以此类推,两个n之间有n个数。

    并且,数的次序可以随意的。

    解决之道:

    准备知识:

    ①n对数,共2n个数。所以要有2n个位置来放置这2*n个数。②sum()表示求和运算。

    正式解决:

    ①设k(k=1,2,..,n)放置的第一个位置为ak,第二个位置为bk。显然有bk-ak=k+1(假定下一个位置在上一个位置之前)。

    那么会有sum(bk-ak)=2+3+4+...+(n+1)=(1+2+3+...+n)+(1+1+...+1)=n*(n+1)/2+n。

    ②又因为要有2n个位置来放置这2n个数。则sum(ak+bk)=1+2+3+...+2n=(1+2n)(2n)/2=(1+2n)n。

    ③sum(ak+bk)=sum(ak+ak+k+1)=sum(2ak+bk-ak)=2sum(ak)+sum(bk-ak)=2sum(ak)+n(n+1)/2+n。

    ④比较②③可得:(1+2n)n=2sum(ak)+n(n+1)/2+n。可得sum(ak)=n(3n-1)/4。

    ⑤就像前面已经说过的一样,ak表示数k第一次出现的位置。ak不易确定。当可以肯定的是sum(ak)一定为正整数。

    那么就会有n=4p或者3n-1=4*p(p为正整数)。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <cstring>
    #include <string>
    #include <algorithm>
    #include <vector>
    #include <set>
    #include <map>
    #include <queue>
    using namespace std;
    int main()
    {
        int n;
        while(cin>>n,n)
        {
            if(n%4==0||(3*n-1)%4==0)
                printf("Y
    ");
            else
                printf("N
    ");
        }
        return 520;
    }
  • 相关阅读:
    BigDecimal 的用法
    奇葩问题:Invalid bound statement (not found): cn.zss.zsdemo.mapper.RoleMapper.selectByPrimaryKey
    论文速览:MFQE 2.0: A New Approach for Multi-frame Quality Enhancement on Compressed Video
    博文目录
    【DEBUG】ImportError: No module named 'pygal'
    反直觉的三门问题
    一些卷积概念和图解
    MATLAB随手记
    Python3随手记
    论文写作随手记
  • 原文地址:https://www.cnblogs.com/cmmdc/p/6809777.html
Copyright © 2011-2022 走看看