您的位置:首页 > 其它

ZOJ Monthly, August 2012部分题目总结

2012-08-30 21:58 169 查看
zoj 3637 这题并不难,但好像大家都没看出来,我们也没看来。。

给一些区间,每个区间都有权重,选择一些不重复区间,求最大权重。

首先会想到朴素的dp,dp[i]表示时间为i时的最大收益

dp[i] = max(dp[i-1],max(dp[course[j].begin_time] + weight[j]));

然后我们会发现只有当i是一门课的终止时间的时候,才可能发生第二种转移。

所以我们只要实现保存一下以时间i为终止时间的课程即可,然后就可以A掉了

zoj 3638

带上下限的组合问题。

n个数,和为m,首先不考虑任何限制的话,就是C(m+n-1,n-1),如果考虑某数下限是x那么个数就是C(m+n-1-x,n-1),通过这种方法,我们可以一次性解决所有下限的问题,考虑所有下限到得到全集就是C(m+n-1-sum(x),n-1),然后对于上限,就很明显的发现就是个容斥求交。设si是关于第i个数的不和法个数.那么我们的答案就是U- sum(s1+s2+s3..+sn) + sum(s1*s2+s1*s3..) -...sum(s1*s2*s3..*sn);

最后还要提的一点就是对于C(n,m)%mod,我们是要用逆元的,而且因为mod是素数,所以可以直接用费马小定理,a*a^(p-2) = 1(mod p)

zoj 3640

这提也不难,感觉当时就没理解题义,然后觉得不好做就没继续想。。

随机选一条路,如果能力f大于难度c则会花ti天走完结束游戏,否则会花一天,然后能力加c,继续游戏。

很容易想到递推的。用dp[i]表示能力为i时的走完的期望。

zoj 3634

这题确实是个好题。要好好总结一下(参考自官方解体报告)

题义(贴官方的)有一只Bounty Hunter,他按顺序从城市1跑到城市n,在每个城市进行两个操作:买攻击力和做任务。在城市i,每点攻击力要花费块钱。买完攻击力以后做任务时可以获得atp*bi(atp为当时的攻击力)的钱,问最后Bounty Hunter最多能获得多少钱。

对于第i个城市的策略。我们要知道此时的钱,atp。最优值是钱,但是城市个数和atp的都很大,而且atp还是实数,无法用下标来表示,所以这提用常规的方法是很难做的。

但是进一步理解题目后我们发现。

1.atp和钱的转换关系是常数关系,所以可以把两者对最后收益的贡献分开看。

2.因为运用单位变量的表示办法(这个很神!),atw[i]和mow分别表示到第i个城市只有1金钱和1攻击力时的最后收益。

这两点真心觉得很秒,值得让人好好体味。

然后决策方程就是

apw[i] = apw[i + 1] + mow[i + 1] * b[i];

mow[i] = max(1.0 / a[i] * b[i] * mow[i + 1] + apw[i + 1] * 1.0 / a[i], mow[i + 1]);

第一个很好,第二个表面上是花1元钱买攻击力还是不花钱,其实其实质是一单位金钱去买攻击力带来的最后收益,和不买攻击力的最后收益。花x元钱就是在两边都乘x,并不改变大小关系。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  任务 游戏 c bi