zoukankan      html  css  js  c++  java
  • 20200413(DEF)题解 by 孙晨曦

    D、E、F题:孙晨曦

    题解:

    D题题解:组合数。
    (直接选出来C(n,k)个位置,然后这k个位置取全排列的话,需要考虑去重,所以换个选法) 
    这样做,先选出k个位置,然后只取让这k个位置都不能选择自己的indice的排列
    例如,3个数,就只能选取231,312这两种排列。
    经模拟得出1个数有0个这种排列,2个数有1个这种排列,3个数有2个,4个数有9个。
    设个数组p[1]=0,p[2]=1,p[3]=2,p[4]=9
    所以就可以得到,对于n,k,答案为
    C(n,k)*p[k]+C(n,k-1)*p[k-1]+...+C(n,1)*p[1] +1
    最后这个+1是因为以上过程没取从小到大顺序的这一种排列(1234567),所以要加上。。。思路挺简单,题解好像写的有点麻烦了

    E题题解:折半搜索(meet in the middle)。
    n=35,所以用折半搜索降低搜索的复杂度
    用两个set存两次搜索的模m下的每个和
    然后合并,更新最大值。
    合并的方法是枚举第一个set的值(设为i),用upper_bound从第二个set中找第一个大于m-1-i的位置,有种情况:
    ①如果这个位置是set2.begin()的话,就说明set2中每个数加上i,都比m大,都要取余,那么set2中加i模m的值最大的数应该是set2中最后一个数,即取[set2.end()-1]的位置上的那个数。
    ②如果不是set2的首位置,那么set2中加i模m的最大值应该就是[这个位置-1]的位置上的那个数。


    (下面是折半搜索的详解和两个例题)
    https://blog.csdn.net/qq_45530271/article/details/104239624

  • 相关阅读:
    bzoj1083: [SCOI2005]繁忙的都市 瓶颈生成树
    Codeforces Round #344 (Div. 2)C. Report
    Wannafly挑战赛14E无效位置
    Codeforces Round #378 (Div. 2)F
    1059: [ZJOI2007]矩阵游戏 二分图匹配
    Educational Codeforces Round 42 (Rated for Div. 2)F
    bzo1016: [JSOI2008]最小生成树计数
    bzoj1009: [HNOI2008]GT考试 ac自动机+矩阵快速幂
    bzoj1070: [SCOI2007]修车
    table表格frame属性
  • 原文地址:https://www.cnblogs.com/QLU-ACM/p/12921891.html
Copyright © 2011-2022 走看看