首页 > 其他分享 >题解 - Game on Sum (Easy Version)

题解 - Game on Sum (Easy Version)

时间:2024-11-25 09:46:43浏览次数:10  
标签:题解 namespace Alice 显然 Game Version times10 define

题目,还是不挂洛谷。

Alice 镇楼

题目大意

Alice 和 Bob 又在玩游戏。

该种游戏共分为 \(n\) 轮,每轮中,先有一个数 \(x = 0\),Alice 将选择 \(t \isin [0, t_{max}]\),而 B 将会选择将 \(x\) 增加或减少 \(t\)。在全部 \(n\) 轮中,B 应至少有 \(m\) 次选择减少操作。

Alice 希望结果最大,而 B 希望结果最小,并且他们都会做出最优决策。

求问最终 \(x\) 的值。

思路简析

感觉这个很博弈论。

每步最优操作,要推 dp 的样子还是比较显然的吧?

这里只有 \(n, m\) 是给定变量,所以显然以其为状态。

考虑 \(f_{i, j}\) 的一个值即进行了 \(i\) 轮时,已经进行 \(j\) 次增加操作时的 \(x\) 值。

边界为 \(f_{i, 0} = 0, f_{i, i} = i \times k\)(当 \(j = 0\) 时,Alice 必选 \(0\),当 \(j = i\) 时,Alice 必选 \(k\))。

由于是 B 进行操作,那么他必然是取小,易得转移方程:

\(f_{i, j} = \min{f_{i-1, j}-t, f_{i-1, j-1}+t}\)

\(Range : i_{1\rightarrow n}, j_{1\rightarrow \min{i-1, m}}\)

考虑 Alice 要尽量大,那么就不能让 B 选出最小的,所以她会使 \(f_{i-1, j}-t = f_{i-1, j-1}+t\),整理得 \(t = \frac{f_{i-1, j}-f_{i-1, j-1}}{2}\),那么 \(f_{i, j} = f_{i-1, j-1}+t = \frac{f_{i-1, j}+f_{i-1, j-1}}{2}\)。

最终结果是 \(f_{n, m}\)。

然后我们写完了就会发现这是显然不对的,因为样例里有分数,而 \(f_{i, j}\) 显然无法存入分数。

这个怎么办?一开始我还想分开存分子和分母,于是突击乘法逆元,然后你看定义:

如果一个线性同余方程 \(ax \equiv 1 \pmod b\) ,则 \(x\) 称为 \(a \bmod b\) 的逆元,记作 \(a^{-1}\) 。

那我们正好就是要把这个数乘上 \(2^{-1}\) 的。所以要找到 \(2x \equiv 1 \pmod {10^9+7}\),得 \(x = 5\times10^8+4\),所以把每个 \(f_{i, j}\) 都乘上 \(5\times10^8+4\) 即可(相当于除以 \(2\))。

(\(2147482647 \div (5\times10^8+4) \approx 4\),所以在代码里这里要乘上 1LL。)

但是你考虑这样的话时间复杂度是 \(O(T\cdot n\cdot m)\) 即 \(4\times 10^9\) 的。

怎么办怎么办,但是你仔细看一眼这里除了 \(k\) 真有啥是必要的吗?显然对于这个 dp \(n\) 和 \(m\) 只是一个范围,那么我们只要把范围推够了即可。那么我们可以预先钦定一个 \(k = 1\),然后对于每一问进行对 \(k\) 的一个乘,即是答案(这样的话上面转移方程的范围 \(i\) 应是到 \(n_{max}\) ,\(j\) 也可以去掉 \(m\) 了,这很好。)。

点击查看代码
#include <bits/extc++.h>
namespace {
using namespace std;
using namespace __gnu_pbds;
#define fiin(x) freopen(x".in", "r", stdin)
#define fiout(x) freopen(x".out", "w", stdout)
#define files(x) fiin(x), fiout(x)
#define und unsigned
#define ll long long
#define db double
#define pii pair<int, int>
#define mp(x, y) make_pair(x, y)
#define m1p(x, y) ((x<<14)+y)
#define fir first
#define sec second
#define hap gp_hash_table
// #define pri_que 
const int man = 2e3+10, mop = 1e9+7, inv = 5e8+4;
}

int T, n, m, k, li, lj;
int f[man][man];
int main () {
    files("test");
    scanf("%d", &T);
    for (int i = 1; i <= 2e3; ++ i) {
        f[i][i] = i;
        for (int j = 1; j < i; ++ j) 
            f[i][j] = 1LL*(f[i-1][j]+f[i-1][j-1])*inv%mop;
        }
    while (T --) {
        scanf("%d%d%d", &n, &m, &k);
        printf("%lld\n", 1LL*f[n][m]*k%mop);
    } return 0;
}

标签:题解,namespace,Alice,显然,Game,Version,times10,define
From: https://www.cnblogs.com/stamorlin/p/18565627/CF1628D1

相关文章

  • 【题解】洛谷P11311、P2943: 漫长的小纸带、Cleaning Up G
    赛时不会去想dp,感觉没法转移,然后去写了贪心,然后直接假掉唐完了。为什么贪心不能做,因为多个数的话还是可能被减,\(3\)个数长度为\(11\)就可以变成\(9\),非常划算,好像很显然,但是为什么我赛时写了只会有长度\(2\)的区间唐完了。考虑dp,设\(f_i\)表示\(1-i\)的最小代价,枚举......
  • CF2038A - Bonus Project 题解
    题目传送门https://codeforces.com/contest/2038/problem/A先大致捋一下题目的含义一共有n个工程师,每个工程师完成相应的工作都有一定的奖金a,但同时也会消耗成本b,目前一共有k个工作需要做这些工程师对他们的同事很友好,他们能接受自己的总收益为0来增长经验,但不能接受自己为负......
  • 题解:[P11311 漫长的小纸带]
    P11311漫长的小纸带题意:有一个长度\(n\)的序列\(a\),将\(a\)分成若干段,使得所有段价值和最小,定义价值为一段内元素数量的平方。思路:显然能用动态规划来计算答案,设\(f[i]\)表示到第\(i\)个位置所获得的最小价值,考虑怎么转移。最直接的就是从\(1\)到\(i-1\)枚举断......
  • 读数据质量管理:数据可靠性与数据质量问题解决之道10数据平台
    1.      数据平台1.1.        让你能够从摄取数据到分析数据的整个过程中全面管理数据的技术组合1.2.        数据平台的要求随着业务的变化而变化1.3.        数据栈分为6层1.3.1.          数据摄取1.3.1.1.     ......
  • 读数据质量管理:数据可靠性与数据质量问题解决之道09数据可靠性
    1.      数据可靠性1.1.        数据可靠性指的是一个组织在整个数据生命周期中提供高数据可用性和健康状况的能力1.1.1.          是高数据质量带来的结果1.1.1.1.           高质量的大数据是这个大规模转型平台的核心1.1.2. ......
  • 2018 ICPC南京区域赛题解 更新至 8 题
    2018ICPC南京区域赛题解更新至8题The2018ACM-ICPCAsiaNanjingRegionalProgrammingContest目录2018ICPC南京区域赛题解更新至8题The2018ACM-ICPCAsiaNanjingRegionalProgrammingContestPrefaceProblemA.AdrienandAustinProblemD.CountryMeowProblem......
  • 题解:[ARC188C] Honest or Liar or Confused
    乍一看以为是3-SAT不可做,动动脑子发现是2-SAT(鉴于本题解书写时洛谷题面暂无中文翻译,为避免可能的歧义或困惑,先对本题解中的译法进行约定:英文题面中“honestvillager”或日文题面中“正直者”译为“诚实村民”。英文题面中“liar”或日文题面中“嘘つき”译为“撒谎村民”......
  • CF1328题解
    CF1328A简单题,我们用\(b-a%b\)的余数即可,注意特判\(a%b==0\)即可CF1328B细节蛮多的,我们可以发现最终个数可以写成\(1+2+3+\dots+(p-1)+p+g\)最后\(n-p\)就是第一个b的位置,\(n-g\)就是第二个b的位置,可以推式子然后\(O(n)\)求但是我选择二分查找g,然后注意一下细节......
  • VMware App Volumes 4, version 2410 (4.15) - 实时应用程序交付系统
    VMwareAppVolumes4,version2410(4.15)-实时应用程序交付系统重新定义跨VDI、DaaS和已发布的应用环境交付和管理应用的方式请访问原文链接:https://sysin.org/blog/vmware-app-volumes/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org关于VMwareAppVolu......
  • CF 1638 题解
    CF1638题解AReverse贪心的想,找到第一个\(a_i\not=i\)的位置,然后操作\([i,pos_{a_i}]\)这个区间即可.BOddSwapSort由于只能交换奇数和偶数,奇数偶数内部的相对位置不能改变,因此合法的充要条件是奇数之间已经有序,偶数亦然.CInversionGraph由于有效树边只......