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 }