P1230 智力大冲浪
Posted liqgnonqfu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1230 智力大冲浪相关的知识,希望对你有一定的参考价值。
题目大意:
开始你用有一笔钱,要去完成n个任务,每个任务需要一个单位的时间,但有最晚完成时间ti,若没完成,就扣掉相应的钱wi,问如何能留下最多的钱。
思路:
这题很奇怪没给数据范围,我能想到最优的是n*logn的。
总体想法就是,若当前任务冲突还扣钱很多,就挑出在它之前的扣钱最少的与它交换。先把游戏按截止时间排序,按扣掉的钱数建一个小根堆表示准备做的任务,访问每一个任务,若时间来的及,就加入堆;否则与堆顶元素比较看是否交换。
1 #include<cstdio> 2 #include<queue> 3 #include<algorithm> 4 5 using namespace std; 6 7 struct node 8 { 9 int t,w; 10 node() 11 { 12 t=0;w=0; 13 } 14 bool operator < (const node &x)const 15 { 16 return w>x.w; 17 } 18 }qian[100000]; 19 20 int n,ans,m; 21 priority_queue<node> dui; 22 23 bool comp(node x,node y) 24 { 25 if(x.t<y.t)return true; 26 else return false; 27 } 28 29 int main() 30 { 31 scanf("%d%d",&n,&m); 32 for(int i=1;i<=m;i++) 33 { 34 scanf("%d",&qian[i].t); 35 } 36 for(int i=1;i<=m;i++) 37 { 38 scanf("%d",&qian[i].w); 39 } 40 // printf("!!!!! "); 41 sort(qian+1,qian+1+m,comp); 42 dui.push(qian[1]); 43 ans=n; 44 int cnt=1; 45 for(int i=2;i<=m;i++) 46 { 47 if((qian[i].t==qian[i-1].t)&&(cnt==qian[i].t)) 48 { 49 node tem=dui.top(); 50 if(tem.w<qian[i].w) 51 { 52 ans-=tem.w; 53 dui.pop();cnt--; 54 } 55 else 56 { 57 ans-=qian[i].w; 58 continue; 59 } 60 } 61 cnt++; 62 dui.push(qian[i]); 63 // printf("%d ",dui.top().w); 64 } 65 printf("%d ",ans); 66 return 0; 67 } 68 /* 69 1000 70 7 71 4 2 4 3 1 4 6 72 70 60 50 40 30 20 10*/
以上是关于P1230 智力大冲浪的主要内容,如果未能解决你的问题,请参考以下文章