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*/
View Code

 

以上是关于P1230 智力大冲浪的主要内容,如果未能解决你的问题,请参考以下文章

P1230 智力大冲浪

P1230 智力大冲浪

题解p1230 智力大冲浪

智力大冲浪(洛谷P1230)

P1230 智力大冲浪(洛谷)

洛谷P1230 智力大冲浪