uva 12654

dp,用优先队列存,上个节点节点覆盖下来的长度;

不过还不是很明白;

 1 #include<cstdio>
 2 #include<queue>
 3 #include<algorithm>
 4 #define maxn 1005
 5 #define inf 999999
 6 using namespace std;
 7 struct node
 8 {
 9     int id;
10     int v;
11     node(int id=0,int v=0):id(id),v(v){}
12     bool operator<(const node &t)const
13     {
14         return v>t.v;
15     }
16 };
17 priority_queue<node>q1,q2;
18 
19 int f[maxn],a[maxn];
20 int main()
21 {
22     int n,c,t1,t2,x;
23     while(scanf("%d%d%d%d",&n,&c,&t1,&t2)!=EOF)
24     {
25         while(!q1.empty())q1.pop();
26         while(!q2.empty())q2.pop();
27         q1.push(node(0,0));
28         q2.push(node(0,0));
29         for(int i=1;i<=n;i++)scanf("%d",&a[i]);
30         for(int i=1;i<=n;i++)
31         {
32             while(!q1.empty()&&a[q1.top().id+1]+t1<a[i])q1.pop();
33             while(!q2.empty()&&a[q2.top().id+1]+t2<a[i])q2.pop();
34             f[i]=inf;
35             if(!q1.empty())f[i]=min(f[i],q1.top().v+t1);
36             if(!q2.empty())f[i]=min(f[i],q2.top().v+t2);
37             q1.push(node(i,f[i]));
38             q2.push(node(i,f[i]));
39 //            printf("%d
",f[i]);
40         }
41         printf("%d
",f[n]);
42     }
43     return 0;
44 }
View Code
原文地址:https://www.cnblogs.com/yours1103/p/3425969.html