POJ 1821 DP+单调队列

题目链接 POJ 1821

首先先吐槽高校邦这恶心的东西,不仅无法在后台挂着,而且视频还内嵌题目,说白了就是他娘的弹窗暂停。这就意味着我不得不像while(1)那样时不时的盯着旁边的那台电脑。这感觉简直烦透了。。(要是有select/epoll这类的东西多好)

题目核心是DP,状态转移方程为

dp[i][j]=max(dp[i-1][j],dp[i][j-1],dp[i-1][j]+worker[i].P * (j-k) )

由于dp[i-1][j]+worker[i].P*j为定值,因而只需要找k符合相对小的worker[i].P*k,与j无关因而使用i层次上的队列。

哦对.. POJ的G++编译器就是个谜啊= = sort算法在我本机上是没问题的,但是submit之后就CE. 原因也很迷... 如果以成员函数重载运算符,那么无论是const _worker&,_worker&亦或是与const属性的结合,都不能通过编译。如果以友元函数重载运算符,那么引用必须为const.... 简直邪门...

这个队列不能用vector,因为涉及到首元素的pop。也不能用queue,因为涉及到pop_back。最后... 也不能用list,因为TLE... 

用deque就好了,数组模拟有点复杂不适合。(而且为什么deque才200多ms,,,数组700多ms....)

AC代码 View Source On GitHub



你可能感兴趣的:(日常训练,每日一血First,Blood,POJ)