首页 > 其他 > 详细

zoj3699Dakar Rally

时间:2014-03-15 23:23:29      阅读:634      评论:0      收藏:0      [点我收藏+]

链接

开两个队列 一个维护价格从大到小用来每次更新买油的价格 让每次都加满 如果当前价格比队列里的某价格低的话就更新 另开以优先队列维护价格由小到大

来更新此时用的油是什么油价的 并减掉

bubuko.com,布布扣
 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 #include<cmath>
 8 #include<queue>
 9 #include<set>
10 using namespace std;
11 #define N 100010
12 #define LL long long
13 #define INF 0xfffffff
14 const double eps = 1e-8;
15 const double pi = acos(-1.0);
16 const double inf = ~0u>>2;
17 LL m[N],co[N],pr[N];
18 LL o[N];
19 int main()
20 {
21     int i,j,n,t,c;
22     cin>>t;
23     while(t--)
24     {
25         cin>>n>>c;
26         memset(o,0,sizeof(o));
27         priority_queue <LL> q;
28         priority_queue<LL, vector<LL>, greater<LL> > p;
29         for(i = 1 ; i <= n ;i++)
30         cin>>m[i]>>co[i]>>pr[i];
31         int flag = 1;
32         int ts = 0;
33         LL sum = 0;
34         for(i = 1; i <= n ;i++)
35         {
36             if(m[i]*co[i]>c){flag = 0;break;}
37             int s = 0;
38             while(!q.empty()&&pr[i]<=q.top())
39             {
40                 sum-=o[q.top()]*q.top();
41                 s+=o[q.top()];o[q.top()] = 0;q.pop();
42             }
43             o[pr[i]] = s+c-ts;
44             if(o[pr[i]])
45             {
46                 sum+=o[pr[i]]*pr[i];
47                 q.push(pr[i]);
48                 p.push(pr[i]);
49             }
50             LL ss = m[i]*co[i];
51             ts=c-ss;
52             while(ss)
53             {
54                 int k = p.top();
55                 if(o[k]<=ss)
56                 {
57                     ss-=o[k];o[k] = 0;
58                 }
59                 else
60                 {
61                     o[k]-=ss;ss = 0;
62                     break;
63                 }
64                 p.pop();
65             }
66         }
67         if(!flag)
68         {
69             puts("Impossible");
70             continue;
71         }
72         while(!q.empty())
73         {
74             int k = q.top();
75             sum-=o[q.top()]*q.top();
76             q.pop();
77         }
78         cout<<sum<<endl;
79     }
80     return 0;
81 }
View Code

zoj3699Dakar Rally,布布扣,bubuko.com

zoj3699Dakar Rally

原文:http://www.cnblogs.com/shangyu/p/3602430.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!