2288: 【POJ Challenge】生日礼物 - #include <Seter> - using namespace Orz;

2288: 【POJ Challenge】生日礼物

Seter posted @ 2011年10月11日 16:49 in BZOJ with tags POJ Heap Link , 2867 阅读

http://www.zybbs.org/JudgeOnline/problem.php?id=2288

RunID User Problem Result Memory Time Language Code Length Submit Time
160293 Seter 2288 Accepted 2708 kb 52 ms C/Edit 2006 B 2011-10-11 18:42:05

改掉一个随机对拍几十组才出现的脑残错误以后直接R1了……居然build前没有初始化位置数组……郁了个闷!

这道题一看就让人想到DP……然后我想了N天DP还是想不出来

这题正解其实是贪心……首先同号的一段肯定是合并起来的……然后把正的全加起来,如果超过了段数,那么就要去掉一段正的,或者并上一段负的,使得减小的值最小。具体操作是:在最小堆中保存每一段的绝对值,然后取最小的那段和左右两段合并起来。

怎么合并呢?我想了半天后来发现我2了……由于取出来的那一段是最小的,所以左右两段的绝对值之和减去取出来那段的绝对值必定是正的,直接替换掉这三段就可以了。这样每次段数都减少1,直到小于等于M为止。

所以题解应该是维护一个堆+一个链表!SPLAY貌似也可以。好长的代码,泪奔!

 

By Seter

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee