首页 > 编程语言 >2023“钉耙编程”中国大学生算法设计超级联赛(2)部分题解

2023“钉耙编程”中国大学生算法设计超级联赛(2)部分题解

时间:2023-07-22 22:11:06浏览次数:31  
标签:钉耙 frac int 题解 sum tot 2023 sg 节点

2023“钉耙编程”中国大学生算法设计超级联赛(2)部分题解

7.20

1002 Binary Number

可以发现,每个位置最多修改两次,再多了没有意义。

当k为0时,无法修改直接输出。

当n为1时,看k的奇偶性,若为奇数则将其翻转输出,否则直接输出。

当n不为1时:

如果给定的次数k小于序列中连续0串的个数,那一定贪心地从前往后修改得到的答案最优,

否则,一定可以将整个序列全部转化为1,即,先将所有的连续0串转化为1,剩下的次数若为偶数,随机挑一段不断操作,若为奇数,则在前一步操作时将一个1变为0,再将其变为1,则剩余的次数变为了偶数次。

这其中有个特殊情况就是序列全为1且k为1,这时必须将一位变为0,选择将最后一位变为0。

1007 foreverlasting and fried-chicken

可以设这个给定的图中度为6和4的顶点为\(u, v\),求出所有与\(u, v\)都有连边的点的个数\(tot\), 和与\(u\)有连边的点的个数\(tot_u\), 与\(v\)有连边的点的个数\(tot_v\),则这两个点贡献的答案为:

\(ans(u, v) = C_{tot}^{4} \cdot C_{tot_u - 4}^{2} + C_{tot}^{4} \cdot C_{tot_v - 4}^{2}\)

最终答案为:

\(\sum_{u = 1}^{n-1} \sum_{v = u + 1}^{n} \ ans(u, v)\)

复杂度为\(O(n^3)\), 考虑使用bitset优化

枚举\(u, v\)两个点不变,对每个节点设一个1000位的bitset,若此节点与i节点有连边,则将第i位设为1,否则为0

判断与两个节点都有连边的节点数可以将两个节点的bitset按位与,然后使用count()函数求得。

1001 Alice Game

考虑将k,n不同值的sg函数打表求出来然后找规律。

首先,当\(n = 0\)时,先手无法行动必输,此时\(sg(0) = 0\),

考虑当\(1 \leq n \leq k\),这时先手只能执行第一步,将整个序列全部吃掉,因此这个局面只有一个\(sg(0) = 0\)的后继,根据sg函数的定义,此时\(sg(n) = mex ( \ \{ 0 \} \ ) = 1\).

当$n = k + 1 \(时,先手既不能执行第一步也不能执行第二步,因此\)sg(k + 1) = 0$.

当\(n \geq k + 2\)时,先手可以执行第二步,吃掉其中\(k\)个之后,还剩\(n - k\)个,考虑将这\(n - k\)个分成两部分,有\((1 , n - k - 1), (2, n - k - 2), ..., ( \lfloor \frac{n - k}{2} \rfloor , n - k - \lfloor \frac{n - k}{2} \rfloor )\)这些分法, 每次分成两部分之后可以将两段序列看成两个独立的游戏, 因此:

\(sg(n) = mex ( \ \{ sg(1) \ xor \ sg(n - k - 1), \ ... \ , sg(\lfloor \frac{n - k}{2} \rfloor) \ xor \ sg(n - k - \lfloor \frac{n - k}{2} \rfloor) \} \ )\)

打表代码
#include <bits/stdc++.h>
using namespace std;
typedef long long lld;
const int N = 1000005;
int k = 0;
int sgg[N];
int sg(int n) {
    if(n == 0) return 0;
    if(n <= k) return sgg[n] = 1;
    if(n == k + 1) return sgg[n] = 0;
    if(sgg[n]) return sgg[n];
    map<int, bool> mp;
    mp.clear();
    for(int i = 1; i <= (n - k) / 2; i++) {
        mp[sg(i) ^ sg(n - k - i)] = true;
    }
    for(int i = 0; i <= n; i++) {
        if(!mp[i]) return sgg[n] = i;
    }
}
int main() {
    cin >> k;
    vector<int> tmp;
    for(int i = 1; i <= 80; i++) {
        cout << "i = " << i << " sg = " << sg(i) << endl;
        if(sg(i) == 0) tmp.push_back(i);
    }
    cout << "sg(n) = 0 : ";
    for(auto v : tmp) {
        cout << v << " ";
    }
    return 0;
}

可以发现,对于每个k, 第一个\(sg = 0\)的位置为k + 1,此后每隔\(4k + 2\)个再次出现\(sg = 0\)

答案就是\((n - k - 1) mod (4k + 2)\), 特判$n \leq k $的情况.

1011 SPY finding NPY

如果在第i位选到了最大值,需要两个前提:

1.最大值出现在第i位.

2.第1至i - 1 位中的最大值出现在第1至k位.

设\(f(i)\)表示在第i位选到最大值的概率,则可得:

\(f(i) = \frac {1}{n} \cdot \frac {k}{i - 1}\)

则能选到最大值的概率为:

$g(k) = \sum {i = k + 1} ^ {n} f(i) = \frac{k}{n} \cdot \sum^{n - 1} \frac{1}{i} $

枚举k, 使用前缀和预处理$\sum_{i = k}^{n - 1} \frac{1}{i} $即可.

1010 Klee likes making friends

考虑dp

设\(f(i)(j)\)表示前i个人中,必选第i个人,且与选的上一个人距离为j时的答案.

假设当前在第i位,与上一个人距离为j, 则上一个人位置为i - j, 现在考虑倒数第三个人的位置. 我们需要保证\([i - m, i - 1]\) 这个长度为m的区间内存在至少两个人,因此倒数第三个人的位置可以存在的区间为\([i - m, i - j)\), 倒数第三个人到上一个人的距离k的范围为\((0, m - j]\), 因此状态转移方程为:

\(f(i)(j) = a_i + min \{ f(i - j)(k) \} \quad (k \in (0, m - j])\)

这样时间复杂度没问题,但是空间过大. 发现j最大为m, 即\(i - j \geq i - m\) 只需要记录i前面m个信息,因此将第一维变为滚动数组即可.

标签:钉耙,frac,int,题解,sum,tot,2023,sg,节点
From: https://www.cnblogs.com/mcggvc/p/17574388.html

相关文章

  • C/C++商品信息管理系统[2023-07-22]
    C/C++商品信息管理系统[2023-07-22]选题4商品信息管理系统的设计与实现一、设计要求本课题要求同学们完成一个信息管理类的课题---《商品信息管理系统》,能够对商品信息进行有效的管理,实现商品信息查询、商品销售、商品进货、商品销售信息统计等方面的基本操作。管理内容(商品......
  • 在windows下使用vs2022编译v8引擎的稳定版本(2023.7.22)
    0.环境配置1.下载v8项目源代码2.下载开发工具3.下载配置项目4.编译安装ninja5.编译v8x64release动态库5.编译v8x64release静态库6.编译v8x64debug相关库动态版本静态版本6.编译v8ia32相关库①release版本动态静态②debug版本动态静态7.结尾......
  • C/C++运动会成绩管理系统[2023-07-22]
    C/C++运动会成绩管理系统[2023-07-22]题目37:运动会成绩管理系统该系统可以记录校运动会全部运动项目的成绩、得分和排名情况,系统功能项以菜单形式显示。项目包括50米、100米、200米、400米、1500米、各接力项目、跳高、立定跳远、三级跳远、铅球等。系统可以实现以下......
  • C/C++疫情信息查询系统[2023-07-22]
    C/C++疫情信息查询系统[2023-07-22]疫情信息查询系统简介一、问题描述为了方便人们快速了解疫情信息,该系统能够提供对各省市卫健委发布疫情数据的录入、查询和统计等功能。疫情数据包括确诊病例、疑似病例等人数信息还包括确诊人的详细轨迹信息。涉及到火车、飞机、长途汽车等......
  • C/C++简易二手交易平台[2023-07-22]
    C/C++简易二手交易平台[2023-07-22]项目一简易二手交易平台题目背景实现一个C2C交易平台管理系统。用户作为买家,购买他人的商品。用户作为卖家,发布自己的商品。需要实现的功能管理员功能:管理员登录、注销查看、搜索、下架商品查看所有订单查看、删除......
  • C/C++教室管理系统[2023-07-22]
    C/C++教室管理系统[2023-07-22]课程题目:教室管理系统内容要求:(1)学生通过这个功能,可以查询相关院系相关教师的个人信息以及开课信息,以便能更好地了解教师及其开课情况。(2)学生通过这个功能,可以查询相关教学楼相关教室的信息以及该教室在每天任一时段的使用情况,或者有课,或者有讲座......
  • C/C++设备预约系统[2023-07-22]
    C/C++设备预约系统[2023-07-22]大型实验室有大量公用试验设备,使用人员众多,使用在线预约管理系统可以有效提高设备的使用效率,节约科研人员的时间。本项目要求设计一个设备预约系统,达到以上目的。建议提供的功能包括:人员管理:使用用户名、密码登录系统。用户包括管理员和一般用......
  • C/C++航空客运订票系统[2023-07-22]
    C/C++航空客运订票系统[2023-07-22]航空客运订票系统1、每条航线所涉及的信息有:终点站名、航班号、飞机号、飞机周日(星期几)、乘员定额、余票量、订定票的客户名单(包括姓名、订票量、舱位等级1,2或3)以及等候替补的客户名单(包括姓名、所需数量)。2、系统能实现的操作和功能如下:(1)查......
  • 2023年最新50道Vue全套vue2+vue3面试题带答案汇总
    此文章不断更新,欢迎大家在评论区补充1.什么是MVVM?M-Model数据:它是与应用程序的业务逻辑相关的数据的封装载体V-View视图:它专注于界面的显示和渲染VM-ViewModel视图-数据:它是View和Model的粘合体,负责View和Model的交互和协作vue双向数据绑定是通过数据劫持结合......
  • 2023-07-22:一共有n个项目,每个项目都有两个信息, projects[i] = {a, b}, 表示i号项目做完
    2023-07-22:一共有n个项目,每个项目都有两个信息,projects[i]={a,b},表示i号项目做完要a天,但是当你投入b个资源,它就会缩短1天的时间,你一共有k个资源,你的目标是完成所有的项目,但是希望总天数尽可能缩短。在所有项目同时开工的情况下,返回尽可能少的天数。1<=n<=10^5,1<=k......