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

    LINK:HDU 2554

    这是昨天晚上小练里面比较有趣的一道题~我在做的时候思路错了,以为数字的排列会有规律,结果后面发现就算有也很难找......╮(╯▽╰)╭

    看了网上的题解,有一种恍然大悟的感觉,就直接把它当做方程来解,只要符合题意的x,y存在即可~

    题解:

          假设双胞胎数为n,那么就共有2n个人,把双胞胎分开,分别记为A类和B类。在进行排列时,ak代表【年龄为k,同时所属分类为A的人在排列中的位置】,同理,bk则表示【年龄为k,所属分类为B的人在排列中的位置】~(注:在此假设ak<bk,sum(i)表示从1到i求和)

          若该排列能符合题目要求,那么:

          ①bk-ak=k+1;(k=1,2,3,......,n)

          ②sum(bk-ak)=sum(k+1)=2+3+...+(k+1)=k*(k+3)/2;

          ③当ak,bk满足以上两个条件时,又应当有2k个位置来放双胞胎

    因此:sum(ak+bk)=1+2+3+......+2*k=k*(1+2k);

          ④同时:sum(ak+bk)=sum(2*ak+(bk-ak))=2*sum(ak)+sum(bk-ak)=2*sum(ak)+k*(k+3)/2;

          只有当所有双包胎都符合上面所有式子,那么才存在符合题意的排列,SO~应为共2n个数,那么k=n时,bk=2n,ak=2n-n-1=n-1;

    由上式可得:sum(ak)=n*(3n-1)/4,sum(bk)=5*n*(n+1)/4;当上面两个式子为整数时,这个n是符合条件的~╮(╯▽╰)╭

    代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 int main()
     4 {
     5     int n;
     6     while( ~scanf("%d", &n) && n)
     7         if(n%4 == 0 || (n+1) % 4 == 0)
     8             puts("Y");
     9         else puts("N");
    10     return 0;
    11 }

    //memory:228KB     time:31ms

  • 相关阅读:
    解决Windows2003不能自动分配移动存储设备及硬盘盘符
    Asp.net2.0工具包AjaxControlToolkit下载和安装
    VC++开发MapX
    MapXtreme 中改变feature颜色
    IIS 发布网站流程
    net 2.0下的asp.net ajax基本使用方法
    vs2005下,"回发或回调参数无效"的解决方法
    MapXtreme 2005 地图标注全攻略
    Mapxtreme符号化
    MapXtreme 使用技巧10例
  • 原文地址:https://www.cnblogs.com/teilawll/p/3275128.html
Copyright © 2011-2022 走看看