前言


正题

题目链接:https://www.luogu.com.cn/problem/P5299


题目大意

有2n2n2n张牌,

  • nnn张强化牌,每张上有一个正整数x(x>1)x(x>1)x(x>1),如果使用后之后的每一张攻击牌伤害都会乘上xxx。
  • nnn张攻击牌,每张上有一个正整数xxx,使用后造成xxx点伤害。

随机抽上来mmm张,然后按照最优策略打出kkk张的情况下,求所有情况造成的伤害和。

1≤k≤m≤2n≤30001\leq k\leq m\leq 2n\leq 30001≤k≤m≤2n≤3000


解题思路

考虑一个最优策略是啥,显然地我们有强化牌肯定优先打出,直到打完或者只剩最后一费。

因为翻倍至少多一倍的伤害,而我们攻击牌肯定是从大往小选,所以不可能一张攻击牌使得伤害翻倍。
先把两种牌按照数组从大到小排序
我们可以分为两种情况讨论

  • 打出k−1k-1k−1张强化牌和一张攻击牌
  • 打出<k−1<k-1<k−1张强化牌和若干张攻击牌

第一种情况我们设fif_ifi​表示选出了iii张强化牌的所有方案中前kkk张牌乘积的和。
然后枚举一个在k−1∼mk-1\sim mk−1∼m之间的数字iii表示抽到了iii张强化牌,然后再枚举攻击力最大的一张攻击牌,剩下的方案用组合数计算即可。

第二种情况比较麻烦,同样的设f0,if_{0,i}f0,i​表示抽了i(i<k)i(i<k)i(i<k)张强化牌的所有方案中所有牌的乘积和。然后设fi,jf_{i,j}fi,j​表示总共选了iii张攻击牌和强化牌,打出了前kkk张强化牌和攻击牌时所有强化牌乘积的和,gi,jg_{i,j}gi,j​则表示造成的伤害和。
然后转移即可。

时间复杂度:O(nm)O(nm)O(nm)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e4,P=998244353;
ll T,n,m,k,a[N],b[N],f[N],g[N],fac[N],inv[N],ans;
ll C(ll n,ll m){if(m>n)return 0;return fac[n]*inv[m]%P*inv[n-m]%P;
}
signed main()
{inv[0]=fac[0]=inv[1]=1;for(ll i=2;i<N;i++)inv[i]=P-inv[P%i]*(P/i)%P;for(ll i=1;i<N;i++)fac[i]=fac[i-1]*i%P,inv[i]=inv[i-1]*inv[i]%P;scanf("%d",&T);while(T--){scanf("%lld%lld%lld",&n,&m,&k);ans=0;for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);for(ll i=1;i<=n;i++)scanf("%lld",&b[i]);for(ll i=0;i<=m;i++)f[i]=g[i]=0;f[0]=1;sort(a+1,a+1+n);reverse(a+1,a+1+n);sort(b+1,b+1+n);reverse(b+1,b+1+n);for(ll i=1,x;i<=n;i++)for(ll j=m;j>=1;j--){if(j<k)(f[j]+=f[j-1]*a[i]%P)%=P;else (f[j]+=f[j-1])%=P;}for(ll i=k-1;i<m;i++){for(ll j=1;j<=n;j++)(ans+=f[i]*b[j]%P*C(n-j,m-i-1)%P)%=P;f[i]=0;}for(ll i=1;i<=n;i++){for(ll j=m;j>=1;j--){(f[j]+=f[j-1])%=P;if(j<=k)(g[j]+=g[j-1]+b[i]*f[j-1]%P)%=P;else (g[j]+=g[j-1])%=P;}}printf("%lld\n",(ans+g[m])%P);}return 0;
}

P5299-[PKUWC2018]Slay the Spire【dp】相关推荐

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

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

  2. 【DP】【期望】$P1850$换教室

    [DP][期望]\(P1850\)换教室 链接 题目描述 有 \(2n\) 节课程安排在$ n$ 个时间段上.在第 \(i\)(\(1 \leq i \leq n\))个时间段上,两节内容相同的课程同 ...

  3. Bailian2760 数字三角形【DP】

    2760:数字三角形 描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (图1) 图1给出了一个数字三角形.从三角形的顶部到底部有很多条不同的路径.对于每条路径,把路径上面的数加起来可 ...

  4. NUC1131 Triangle【DP】

    Triangle 时间限制: 1000ms 内存限制: 65536KB 通过次数: 1总提交次数: 1 问题描述 图1表示一个数字三角形. 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 ...

  5. LeetCode:完全平方数【279】【DP】

    LeetCode:完全平方数[279][DP] 题目描述 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示 ...

  6. 【DP】序列 题解

    [DP]序列 题解 序列 题目 一个长度为kkk的整数序列bbb 1,bbb 2,-,bkbkbk(1≤bbb 1≤bbb 2≤-≤bkbkbk≤NNN)称为"好序列"当且仅当后一 ...

  7. poj 2411 Mondriaan#39;s Dream 【dp】

    题目:poj 2411 Mondriaan's Dream 题意:给出一个n*m的矩阵,让你用1*2的矩阵铺满,然后问你最多由多少种不同的方案. 分析:这是一个比較经典的题目.网上各种牛B写法一大堆. ...

  8. BestCoder冠军赛 - 1005 Game 【DP】

    [题意] 给出一个set,set中有几个数. 现在给出n个人,环成一圈搞约瑟夫... 开始时从第1号报数,每次从set中随机选出一个数s,等报数到s后,报s的人出圈,其他人继续报数. 最后只剩1人时, ...

  9. 【9.22校内测试】【可持久化并查集(主席树实现)】【DP】【点双联通分量/割点】...

    1 build 1.1 Description 从前有一个王国,里面有n 座城市,一开始两两不连通.现在国王将进行m 次命令,命令可 能有两种,一种是在u 和v 之间修建道路,另一种是询问在第u 次命 ...

最新文章

  1. DZX2无法读取会员短消息
  2. 廖雪峰python教程视频-为什么看不懂廖雪峰的Python学习教程?
  3. cudnn v4安装
  4. springmvc怎么解析post_秋招跳槽,面试是拦路虎?【spring、springMVC】- 常见面试题汇总...
  5. 深入浅出python机器学习_9.1.5_通过数据预处理提高模型的准确率_MinMaxScaler
  6. gcovr 安装_Kudu 1.8.0 编译安装配置
  7. 缓慢的http拒绝服务攻击 tomcat_攻击技术
  8. linux里shell中的test代表的意义
  9. 数据库系统概念 第五章 习题答案
  10. 实例079RTF文件的保存
  11. 臭名昭著的Java”
  12. 强化学习: 贝尔曼方程与马尔可夫决策过程
  13. 坚果PRO3搭载Android,安卓 10 来了,坚果 Pro 3 推送 Smartisan OS v7.5.0 早期众测版
  14. 《Kotin 极简教程》第13章 使用 Kotlin 和 Anko 的Android 开发
  15. 级联rc滤波_RC低通,高通滤波电路的基本工作原理
  16. Oracle任意字符串转换成拼音首字母简写
  17. c语言中argc和argv[ ]的作用及用法
  18. 经常用电脑辐射大怎么办?这5个习惯可以防辐射
  19. 基于C++的Qt计算器
  20. 时间序列--自回归模型

热门文章

  1. dnf公共频道服务器不稳定已从初始化状态,DNF公共频道跨区列表 组队连不上必看...
  2. 农商银行招聘计算机人员考什么,农商银行招聘考试题都考什么?
  3. php如果字符串有1 3 5,PHP常用字符串函数小结
  4. Java开发之上班摸鱼!写最少的代码!
  5. html5与课程思政,“课程思政”怎样做
  6. js vue中得延时器_Vue.js实现时分秒倒计时
  7. 如何在mysql中打开mongodb_图解:如何从MySQL移植到MongoDB
  8. 算法题目——读书知识点统计问题(POJ-3320)(尺取法)
  9. [mybatis]映射文件_参数处理_#取值时指定参数相关规则
  10. IDEA导入MySQL的jdbc驱动出现“java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver”