题目链接

题意分析

这个题其实不是期望

就是一共有\(C_{2n}^m\)种情况 每一种情况选择\(k\)张牌 然后求最大攻击值的总和

我们考虑

当前抽出了选出了\(i\)张强化牌 \(m-i\)张攻击牌

首先 可以肯定的是 能出强化牌就尽量出强化牌

我们去枚举\(i\)

如果\(i<k\) 那么就出\(i\)张强化牌 \(m-i\)张攻击牌

如果\(i≥k\) 那么就出\(k-1\)张强化牌 \(1\)张攻击牌

\(CDY(i,j)\)表示i张强化牌出\(j\)张 所有方案强化的倍率之和

\(WZY(i,j)\)表示i张攻击牌出\(j\)张 所有方案强化的攻击力之和

二者分别对应\(CDY(i,i)* WZY(m-i,k-i)\)以及\(CDY(i,k-1)* WZY(m-i,1)\)

根据乘法分配律

现在考虑如何计算 \(CDY\)以及\(WZY\)

首先 对于相同数量的牌 由于跟顺序没有关系 所以我们\(sort\)之后贪心选择最大即可

\(f(i,j)\)表示选了\(i\)张强化牌并且最靠前的是第\(j\)张牌

同理 \(g(i,j)\)同理

详细见代码

CODE:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. #include<cstdlib>
  7. #include<string>
  8. #include<queue>
  9. #include<map>
  10. #include<stack>
  11. #include<list>
  12. #include<set>
  13. #include<deque>
  14. #include<vector>
  15. #include<ctime>
  16. #define ll long long
  17. #define inf 0x7fffffff
  18. #define N 3010
  19. #define IL inline
  20. #define M 1510
  21. #define D double
  22. #define mod 998244353
  23. #define R register
  24. using namespace std;
  25. template<typename T>IL void read(T &_)
  26. {
  27. T __=0,___=1;char ____=getchar();
  28. while(!isdigit(____)) {if(____=='-') ___=0;____=getchar();}
  29. while(isdigit(____)) {__=(__<<1)+(__<<3)+____-'0';____=getchar();}
  30. _=___ ? __:-__;
  31. }
  32. /*-------------OI使我快乐-------------*/
  33. int T,n,m,k,ans;
  34. int cdy[M],wzy[M];
  35. int C[N][N];
  36. int dp[M][M][2],sum[M];
  37. IL int CDY(int x,int y)
  38. {
  39. if(x<y) return 0;
  40. if(!y) return C[n][x];
  41. int res=0;
  42. for(R int j=x-y+1;j<=n-y+1;++j)
  43. res=(res+1ll*dp[y][j][0]*C[j-1][x-y]%mod)%mod;
  44. return res;
  45. }
  46. IL int WZY(int x,int y)
  47. {
  48. if(x<y) return 0;
  49. int res=0;
  50. for(R int j=x-y+1;j<=n-y+1;++j)
  51. res=(res+1ll*dp[y][j][1]*C[j-1][x-y]%mod)%mod;
  52. return res;
  53. }
  54. int main()
  55. {
  56. // freopen(".in","r",stdin);
  57. // freopen(".out","w",stdout);
  58. read(T);
  59. for(R int i=0;i<=3000;++i) C[i][0]=1;
  60. for(R int i=1;i<=3000;++i)
  61. for(R int j=1;j<=i;++j)
  62. C[i][j]=(1ll*C[i-1][j-1]+1ll*C[i-1][j])%mod;
  63. // for(R int i=1;i<=10;++i)
  64. // for(R int j=1;j<=i;++j)
  65. // printf("%d%c",C[i][j],(j==i ? '\n':' '));
  66. while(T--)
  67. {
  68. read(n);read(m);read(k);ans=0;
  69. memset(dp,0,sizeof dp);
  70. for(R int i=1;i<=n;++i) read(cdy[i]);
  71. for(R int i=1;i<=n;++i) read(wzy[i]);
  72. sort(cdy+1,cdy+n+1);
  73. sort(wzy+1,wzy+n+1);
  74. for(R int i=1;i<=n;++i)
  75. {
  76. dp[1][i][0]=cdy[i];
  77. sum[i]=(sum[i-1]+cdy[i])%mod;
  78. }
  79. for(R int i=2;i<=n;++i)
  80. {
  81. for(R int j=1;j<=n-i+1;++j)
  82. dp[i][j][0]=1ll*cdy[j]*(sum[n]-sum[j]+mod)%mod;
  83. for(R int j=1;j<=n;++j)
  84. sum[j]=(sum[j-1]+dp[i][j][0])%mod;
  85. }
  86. for(R int i=1;i<=n;++i)
  87. {
  88. dp[1][i][1]=wzy[i];
  89. sum[i]=(sum[i-1]+wzy[i])%mod;
  90. }
  91. for(R int i=2;i<=n;++i)
  92. {
  93. for(R int j=1;j<=n-i+1;++j)
  94. dp[i][j][1]=(1ll*wzy[j]*C[n-j][i-1]%mod+(sum[n]-sum[j]+mod)%mod)%mod;
  95. for(R int j=1;j<=n;++j)
  96. sum[j]=(sum[j-1]+dp[i][j][1])%mod;
  97. }
  98. for(R int i=0;i<m;++i)
  99. {
  100. if(i<k) ans=(ans+1ll*CDY(i,i)*WZY(m-i,k-i)%mod)%mod;
  101. else ans=(ans+1ll*CDY(i,k-1)*WZY(m-i,1)%mod)%mod;
  102. }
  103. printf("%d\n",ans);
  104. }
  105. // fclose(stdin);
  106. // fclose(stdout);
  107. return 0;
  108. }

HEOI 2019 RP++

「PKUWC2018」Slay the Spire的更多相关文章

  1. loj #2538. 「PKUWC2018」Slay the Spire

    $ \color{#0066ff}{ 题目描述 }$ 九条可怜在玩一个很好玩的策略游戏:Slay the Spire,一开始九条可怜的卡组里有 \(2n\) 张牌,每张牌上都写着一个数字\(w_i\) ...

  2. LOJ2538. 「PKUWC2018」Slay the Spire【组合数学】

    LINK 思路 首先因为式子后面把方案数乘上了 所以其实只用输出所有方案的攻击力总和 然后很显然可以用强化牌就尽量用 因为每次强化至少把下面的牌翻一倍,肯定是更优的 然后就只有两种情况 强化牌数量少于 ...

  3. loj2538 「PKUWC2018」Slay the Spire 【dp】

    题目链接 loj2538 题解 比较明显的是,由于强化牌倍数大于\(1\),肯定是能用强化牌尽量用强化牌 如果强化牌大于等于\(k\),就留一个位给攻击牌 所以我们将两种牌分别排序,企图计算\(F(i ...

  4. 【LOJ】#2538. 「PKUWC2018」Slay the Spire

    题解 由于强化卡都是大于1的,我们分析一下就会发现,尽可能多的用强化卡,至少用一张攻击卡,一定是每组卡牌的最优选择 所以我们把攻击卡和强化卡从大到小排序 我们设\(g[i][j]\)表示前i张卡牌里选 ...

  5. LOJ #2538. 「PKUWC 2018」Slay the Spire (期望dp)

    Update on 1.5 学了 zhou888 的写法,真是又短又快. 并且空间是 \(O(n)\) 的,速度十分优秀. 题意 LOJ #2538. 「PKUWC 2018」Slay the Spi ...

  6. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  7. 「PKUWC2018」随机游走(min-max容斥+FWT)

    「PKUWC2018」随机游走(min-max容斥+FWT) 以后题目都换成这种「」形式啦,我觉得好看. 做过重返现世的应该看到就想到 \(min-max\) 容斥了吧. 没错,我是先学扩展形式再学特 ...

  8. 「PKUWC2018」猎人杀

    「PKUWC2018」猎人杀 解题思路 首先有一个很妙的结论是问题可以转化为已经死掉的猎人继续算在概率里面,每一轮一直开枪直到射死一个之前没死的猎人为止. 证明,设所有猎人的概率之和为 \(W\) , ...

  9. loj#2537. 「PKUWC2018」Minimax

    题目链接 loj#2537. 「PKUWC2018」Minimax 题解 设\(f_{u,i}\)表示选取i的概率,l为u的左子节点,r为u的子节点 $f_{u,i} = f_{l,i}(p \sum ...

随机推荐

  1. PHP与Imagemagick

    Imagemagick:相关站点: ImageMagick中文站:http://www.imagemagick.com.cn/ ImageMagick英文站:http://www.imagemagic ...

  2. Java 设计模式系列(四)生成器模式

    Java 设计模式系列(四)生成器模式 生成器模式也称之为建造者模式.将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.demo 1. 生成器模式原理 1.1 生成器模式结构 ...

  3. JAVA array,map 转 json 字符串

    public class User { private String username; private String password; public String getUsername() { ...

  4. windows-x64 php5.6+apache2.4+mysql配置

    随手一记, 方便以后查找! 1.安装apache2.4 - 下载压缩文件并解压到  D:\Develop\Apache24 - 修改 conf 目录下: httpd.conf 文件 - 服务器目录:  ...

  5. PV对第三方存储的访问模式支持

    访问模式 PV可以使用存储资源提供商支持的任何方法来映射到host中.如下的表格中所示,提供商有着不同的功能,每个PV的访问模式被设置为卷支持的指定模式.比如,NFS可以支持多个读/写的客户端,但可以 ...

  6. Python作图笔记

    感谢莫烦大神,附带他的个人网站链接:https://morvanzhou.github.io/ 再带上官方的文档,多看文档啊!不然参数忘了就没地方查了:https://matplotlib.org/a ...

  7. Python学习-5.Python的变量与数据类型及字符串的分割与连接

    在Python中,变量类型是固定的,一旦声明就不能修改其类型(在Python里感觉不应该用声明,而应该用使用) 正确: var = 1 print(var) var = 2 print(var) 依次 ...

  8. SQL Server—— 如何创建定时作业

    在做SQL server 管理时,往往需要每日执行定时任务,但是如果每天都去人工执行,非常不方便,而且一般定时操作,都应该是在数据库压力不大时,一般是在夜间.所以我们需要创建定时作业来代替人工的执行定 ...

  9. C#集合总结

    1.为什么引入集合? 因为数组长度是固定的,为了建立一个动态的"数组",所以引入了集合. 2.为什么引入ArrayList 非泛型集合? ArrayList可以填补数组的不足,进行 ...

  10. RoadFlow ASP.NET Core工作流配置文件说明

    工作流配置文件及说明如下: { "Logging": { "LogLevel": { "Default": "Warning&qu ...