1. 程式人生 > >【P2672】推銷員

【P2672】推銷員

 1 /*
 2 P2671 推銷員
 3 NOIP2015普及組T4
 4 2018-11-29
 5 貪心+優先佇列
 6 可以將題目視為邊走邊推銷,對於每一次決策都有兩種選擇: 
 7 1.繼續向前走,此時的疲勞值是向前走的疲勞值加上推銷的疲勞值; 
 8 2.不向前走,往回去,此時已經走完路了,所以不需要加上路上的疲勞值; 
 9 因為每次決策都取最大的疲勞值,所以最後的結果就是最大的,可以用優先佇列來儲存每一次的最大值; 
10 
11 同時要去標記最大距離mx,當前位置tmpx,當前最大疲勞值maxP
12 注意最大疲勞值第一次尋找的時候,要用往返路程*2+疲勞值
13 
14 迴圈n次,每一次尋找走最遠的路能增長的最大疲勞值
15 此時,之前的推銷的疲勞值相當於順路,直接加入佇列 16 每一次答案相當於加入佇列中的最大值? 17 為什麼要最大值;;實際上就是最大的疲勞值 18 不管是順路還是往前走,只要加上最大的疲勞值就ok 19 20 */ 21 #include<bits/stdc++.h> 22 using namespace std; 23 priority_queue<int>q; 24 struct node{ 25 int dis,cost; 26 }S[100005]; 27 28 int main(){ 29 S[0].dis=0; 30 S[0].cost=0; 31
int n; 32 cin>>n; 33 for(int i=1;i<=n;i++) 34 cin>>S[i].dis; 35 for(int i=1;i<=n;i++) 36 cin>>S[i].cost; 37 q.push(0); 38 int tmpx=0,maxP=0,tot=0,mx=0; 39 for(int i=0;i<n;i++){ 40 maxP=q.top();mx=tmpx; 41 for(int j=mx+1
;j<=n;j++){ 42 maxP=S[j].cost+(S[j].dis-S[mx].dis)*2,tmpx=j; 43 } 44 if(mx!=tmpx) 45 q.push(ans); 46 for(int j=mx+1;j<tmpx;j++) 47 q.push(S[j].cost); 48 mx=tmpx; 49 tot+=q.top(); 50 q.pop(); 51 cout<<tot<<endl; 52 53 } 54 return 0; 55 }