Mancala

news/2024/11/16 15:43:54/文章来源:https://www.cnblogs.com/huangweiliang/p/18549364

前言:

感觉难度真没有紫吧,因为我在模拟赛场切了耶。

题目描述:

\(n\) 个数,第 \(i\) 个数为 \(a_{i}\),每次可以选择一个 \(i\) 满足 \(a_{i}=i\),并将 \(a_{i}\) 赋值为 \(0\),最后你的得分为剩下的数的和,你希望最后得分越小越好。

给出 \(n, k\),你需要求出所有 \(a_{i} \in \left[ 0,k \right]\) 的情况下,你的得分总和与 \(10^9+7\) 取模。

解题思路 & 代码实现:

我的考场思路是这样的,先思考如果给定 \(a\) 序列,如何求答案。

模拟之后发现,如果有 \(a_{i}=i\) 的话,则一定会操作 \(i\),并且每次一定会选取最前面的 \(i\) 进行操作,因为这样一定不会影响其他可行操作位置。

继续思考,发现每个数对答案的具体贡献只和 后面的总操作数 有关。

假设 \(m_{i}\) 表示 \(i\)\(n\) 的总操作数,那么可以这么分类讨论:

\(a_{i} \le i\) \(a_{i} > i\)
贡献 \((m_{i+1}+a_{i}) \bmod i\) \(m_{i+1}+a_{i}\)
增加的操作次数 \((m_{i+1}+a_{i})/i\) \(0\)

具体解释的话,如果 \(a_{i} \le i\) 那么它的贡献一定是在操作一定次数当前位置后剩余的数,反之就无法操作,只能一直加上去。

增加的操作次数也是同理。

那么我们就可以写出暴力代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 110, mod = 1e9 + 7;
int n, k, a[N], ans;
void solve(int id){if(id > n){for(int i = n, m = 0; i >= 1; i--){if(a[i] <= i) ans = (ans + (m + a[i]) % i) % mod;else ans = (ans + m + a[i]) % mod;if(a[i] <= i) m += (m + a[i]) / i;}return;}for(int i = 0; i <= k; i++)a[id] = i, solve(id + 1);
}
signed main(){// freopen("stone.in", "r", stdin);// freopen("stone.out", "w", stdout);cin >> n >> k;solve(1);cout << ans << endl;return 0;
}

那么我们现在会处理一个序列了,那么可以开始思考正解了。

注意到 \(n,k \le 100\),可以发现 后面的总操作数 的数量级在 \(5 \times 10^4\) 以内。

那么就可以很自然的设置出两个状态。

\(f_{i}\) 表示从后往前考虑到 \(i\) 的最小得分总和。

\(g_{i,j}\) 表示从后往前考虑到 \(i\),操作总数为 \(j\) 的方案数。

那么转移具体如下:
\(\begin{equation}\begin{cases}f_{i} = f_{i} + f_{i+1}+ \sum_{m=0}^{k} g_{i+1,m} \times ((m+j) \bmod i) & &(j \le i) \\f_{i} = f_{i} + f_{i+1}+ \sum_{m=0}^{k} g_{i+1,m} \times (m+j) & &(j > i)\\ \end{cases} \end{equation}\)

\(\begin{equation}\begin{cases}g_{i,m + (m + j) / i} = g_{i,m + (m + j) / i} + g_{i + 1,m}& &(j \le i) \\g_{i,m} = g_{i,m} + g_{i + 1,m}& &(j > i) \\\end{cases} \end{equation}\)

那么正解代码如下:

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N = 110, M = 5e4 + 10, mod = 1e9 + 7;
int f[N], g[N][M];
signed main(){// freopen("stone.in", "r", stdin);// freopen("stone.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, k;cin >> n >> k;g[n + 1][0] = 1;for(int i = n; i >= 1; i--){for(int j = 0; j <= k; j++){//a[i]for(int m = 0; m <= k * n; m++){//m[i+1]if(j <= i) g[i][m + (m + j) / i] = (g[i][m + (m + j) / i] + g[i + 1][m]) % mod;else g[i][m] = (g[i][m] + g[i + 1][m]) % mod;}}for(int j = 0; j <= k; j++){if(j <= i){f[i] = (f[i] + f[i + 1]) % mod;for(int m = 0; m <= k * n; m++)f[i] = (f[i] + g[i + 1][m] * ((m + j) % i) % mod) % mod;}else{f[i] = (f[i] + f[i + 1]) % mod;for(int m = 0; m <= k * n; m++)f[i] = (f[i] + g[i + 1][m] * ((m + j) % mod) % mod) % mod;}}}cout << f[1] << endl;return 0;
}

时间复杂度 \(O(n^2k^2)\)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834635.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20222406 2024-2025-1 《网络与系统攻防技术》实验五实验报告

20222406 2024-2025-1 《网络与系统攻防技术》实验五实验报告 1.实验内容对网站进行 DNS 域名查询,包括注册人、IP 地址等信息,还通过相关命令查询 IP 地址注册人及地理位置。尝试获取 QQ 好友 IP 地址并查询其地理位置。使用 nmap 对靶机环境扫描,获取靶机 IP 活跃状态、开…

delphi 新版内存表 FDMemTable

c++builder XE 官方demo最全60多个 http://community.embarcadero.com/blogs?view=entry&id=8761FireDAC.Comp.Client用好FDMemTable代替之前的ClientDataSet,以前ClientDataSet内存表转换太繁琐了步骤。TClientDataSet *cds = new TClientDataSet(this); DataSetProvid…

理想雪 - 翠鸟协会

写在前面3844 字 | 小说 | 热爱 | 思考 | 表达 | 坚定 | 证明 | 坚守《理想雪》系列故事均为架空世界观,所有人名、地名等与现实世界无任何关联。该系列只且仅只为了说明,小说作者在该情境下会诞生的想法和采取的行动,以及背后的世界观、价值观和人生观。因此将具有强烈的个…

专题课:综合案例5

评委打分解答: 1.首先肯定要键盘录入6个评委的分数6个评委的分数,即6个变量,我们肯定用数组更加方便,因为后面求和求最大值之类的,用数组都更简单 遍历数组,我们每键盘打出一个元素就将其放入数组中 . 2.然后定义求和变量,将6个分数求和3.for循环搭配if筛选求最大、最小…

# 20222403 2024-2025-1 《网络与系统攻防技术》实验六实验报告

1.实验内容 本实践目标是掌握metasploit的用法。 指导书参考Rapid7官网的指导教程。 https://docs.rapid7.com/metasploit/metasploitable-2-exploitability-guide/ 下载官方靶机Metasploitable2,完成下面实验内容。 (1)前期渗透 ①主机发现(可用Aux中的arp_sweep,search一…

_app搭建笔记

逍遥模拟器端口号:21503 (3)adb install +包名的绝对路径 安装apk包 案例:adb install E:\dcs\two\app\mojibase.apk E:\dcs\two\app\baiduyuedu_5520.apk (4)活动路径名: aapt d badging D:\app\baiduyuedu_3760.apk(5)adb uninstall 包名:卸载 com.baidu.yued…

20222323 2024-2025-1 《网络与系统攻防技术》实验六实验报告

1.实验内容 掌握metasploit的用法。 下载官方靶机Metasploitable2,完成下面实验内容。 (1)前期渗透 ①主机发现(可用Aux中的arp_sweep,search一下就可以use) ②端口扫描:可以直接用nmap,也可以用Aux中的portscan/tcp等。 ③选做:也可以扫系统版本、漏洞等。 (2)Vsft…

InDesign 2025 for Mac(Id2025)最新激活版20.0.0

InDesign 2025具备强大的功能和灵活的扩展性,支持插件扩展,用户可以根据自身需求自定义工具和工作流程。在处理复杂排版和多页面设计时,InDesign 2025注重用户界面的友好性与功能的直观性,即使是新手用户也能快速上手。 InDesign 2025增强了多模态图文编辑能力,使得图像与…

【跟着阿舜学音乐-笔记】1.12和弦功能与进行原理

七和弦 七和弦是三和弦的基础上叠加三音构成的和弦(四个音的和弦)。其中小大七和弦(CmM7)很少运用,因为调内没有小大七和弦,同时听感上也不是很好。 注:有另一种和弦命名方式,即三和弦与根音呈大小七度的音组成和弦的命名法,该命名法对比上述命名法有个特例——增大七…

看过这个,你可能更了解指针一点(2)

先来看下图你认为以下的打印的结果是什么? 接下来,我们先来分析 ****在1中arr单独放在sizeof内表示整个数组, 因此计算的为整个数组大小。即6乘1得到6 1的答案为6 ****在2中arr没有被单独放在sizeof中, arr此时表示数组首元素的地址,+0则表示计算的是第一个元素地址的大小,…

stoi函数介绍

stoi 是 C++ 标准库中的一个函数,定义在头文件 <string> 中,它用于将字符串转换为整数类型。 函数原型 int stoi(const std::string& str, size_t* idx = 0, int base = 10);str(必选):要转换的字符串,必须以数字开头(可以包含正负号)。 插一句题外话 如果不…

数据采集与融合技术-第四次实践作业

gitee链接:作业4 作业①: 要求: 熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。 使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。 候选网站:东方财富网:http://quote.eastmoney.co…