• 模拟测试46


    T1:

      题意:

        给定一个大小为N的集合,输出任意一种方案,使得子集中所有元素之和是N的倍数。

      题解:  

        考虑前缀和,当前缀和在取模意义下相等时,就为一种答案。

        我们发现0~N一共有N+1个前缀和,但只有0~N-1的N个取值,根据抽屉原理,至少有两个前缀和相同。

        于是这题就解决了。

        时间复杂度$O(N)$。

    T2:

      题意:

        给定N个数,求至少删去几个数,使剩下的数能够组成一个相邻元素不相等的排列。

      题解:

        方案合法,当且仅当任何一个数的出现次数不大于其他数总次数加一。

        所以删去的数个数为$max(0,2*ma-n-1)$。

        看似简单却有问题,N<=50000000,而内存仅有16MB。

        用一个id表示当前元素,cnt表示个数。

        从前向后扫一遍,若cnt==0,则使id等于当前A[i],其他条件下,若id==A[i],则cnt++,反之则cnt--,最后的id即为最多的元素。

        中途如果cnt被减成0,那么当前他一定不能满足答案,同时其他值也不能,那么这段就可以被删掉。

        最后再扫一遍求出ans即可。

        时间复杂度$O(N)$。

    T3:

      题意:

        给N个数,每次将每个数亦或0~(1<<m)-1中的一个值,将其从大到小排名,将每个数的权值加上排名的平方,排名从0开始。最后输出所有数的全职磨1e9+7的亦或和。

      题解:

        从零开始排名,相当于求每轮大于x的值的个数。

        求出f[i],表示前i-1位与x相同,第i位与x不同的数的个数,可以trie树解决,位数从高向低数。

        把平方看作两个人,则权值为每轮两个人的数同时大于x的方案数的总和。

        枚举f[i]和f[j]。 

        由于前i-1位相同,故亦或的数当该两位为特定值时,满足上述条件。

        两位已经固定,则一共有$2^{m-2}$个值可供亦或。

        注意i与j不能相同。

        答案为:

          $sum_{i=1}^m sum_{j=1}^m [i!=j]*f[i]*f[j]*2^{m-2}$

        时间复杂度$O(NM^2)$

  • 相关阅读:
    Leetcode Python笔记
    Jenkins 自动化构建基于svn的vue项目 ,以及uniapp的H5项目
    Jenkins 持续化部署
    java中的各种锁详细介绍
    Maven私有仓库搭建 Nexu3
    Spring Cloud构建微服务架构(一)服务注册与发现
    SpringCloud学习笔记(开篇)
    介绍一款 redis 可视化工具
    java 在线网络考试系统源码 springboot mybaits vue.js 前后分离跨域
    java OA办公系统源码 Springboot Activiti工作流 vue.js 前后分离 集成代码生成器
  • 原文地址:https://www.cnblogs.com/hz-Rockstar/p/11548525.html
Copyright © 2020-2023  润新知