3969: pq

时间限制: 1 Sec 内存限制: 512 MB O2
提交: 60 解决: 22
[提交][状态][博客][加入收藏]
题目描述
小q 的女朋友送给小q nn个整数。但是这些数太大了,小q 的女朋友拿不动,于是拜托小q把这些数减少一些。
小q 每次可以选择其中的两个x,yx,y (不能同时选择同一个数) 变成x−P,y−Qx−P,y−Q,现在他希望能知道最多能帮女朋友减掉多少P,QP,Q。
输入
第一行一个数表示nn。
第二行由空格隔开的nn个数。
第三行两个数,表示p,qp,q。
输出
一行一个数,表示能减掉的PP和QQ的总和。
样例输入
输入样例1
2
100 100
50 50
输入样例2
3
50 250 50
50 100
输入样例3
4
123 456 789 555
58 158
样例输出
输出样例1
200
输出样例2
300
输出样例3
1728
提示
对于前20%20%的数据,n≤5n≤5;
对于100%100%的数据,1≤n≤50,ci≤2000,50≤P,Q≤20001≤n≤50,ci≤2000,50≤P,Q≤2000。
来源
2018年10月hnsdfz集训

[提交][状态]

题解

考虑暴力,由数据发现每一个数被减的次数不超过40,而我们关心的只是每个数被减去p,q的次数x,y,枚举x可求得y,那么枚举每一个数的x,即可判断是否合法,取最大值即可。
考虑优化,由于在枚举的过程中,对于新的一个数,已知x,y,我们关心的只有前面的被减去且还未被匹配的p,q的个数总和,而不必关心每个数分别被减去多少p、q,故状态可以减少。那么用DP表示,设F[i][j][k]为前i个数剩j个p,k个q需要匹配,最多能减去多少,转移分讨一下即可。而j、k均不为0时,它们都不大于40,一个数为0时,另一个数不大于2000,故状态数不会太多,时间效率正确。

猜你喜欢

转载自blog.csdn.net/sz_165394732/article/details/83212718
pq