UOJ Logo kczno1的博客

博客

srm 691 div1 - 500的各种做法

2017-10-17 19:34:30 By kczno1

题意:

$n$场比赛

打第i场加 $a_{i}$ 经验,且打完获得当前经验 * $b_{i}$ 的奖金

打完$n/2$场获得$x$的经验(保证$n$为偶数)

任意安排顺序,求最大奖金

$b_i<=10,n<=50,x和a_i<=10^5$

题解:

1 dp(标算)

如果不考虑$x$的话是可以贪心的。

因为考虑相邻两个$a_1,b_1,a_2,b_2$

交换后的变化=$a_2*b_1-a_1*b_2$

所以交换更优<=>$a_2/b_2>a_1/b_2$

只有$a/b$降序时无法交换,达到最优

所以$1..n/2$场与$n/2+1..n$场都是按$a/b$降序的。

按$a/b$降序排序后

枚举$n/2+1..n$场的$b_i$的和

然后dp,记录打了前几场,有几场在后面一半打,以及后面一半打的$b_i$的和。

复杂度$O(n^4*b^2)$ ,常数较小

2 随机化

先按$a/b$降序排序

然后考虑随机哪些点在后面一半打之后就可以贪心了

先让在后面一半的在后面一半打作为初始解

每次随机交换一个在前面的和在后面的

退火,甚至只有更优才交换,都能过。。

可以极快ac。

我目前也不知道怎么卡。。。

3 贪心+枚举

注意到$b$很小,而$b$一样的必定要让$a$大的在前面

(其实一开始想的是利用这一点暴力dp,但发现状态数会达到6^10,时空都炸)

利用这一点,暴力枚举每个$b$在后面$n/2$个占几个 然后在$O(n)$检验

最差情况下就是每个$b$都有$5$的$a$,差不多要枚举$10^7$次

勉强能过吧

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。