51nod 1380(貪欲+セット)「ポンピング3つ毎のジャケットマスター」

 

ポータル

 

•参考資料

  [1]:マスターをポンピング3つ毎の51Nod-1380-ジャケット

•問題の意味

  長さnの配列から、$ \ FRAC和よう{N} {3} $隣接していない最大値を(両方を同時に取ることができない)で抽出

•問題解決

  欠失は(A_L $ $)、及びその右(A_R $ $)これらの3つの数字の左側などの$ A_ {最大} $を含むながら、現在の最大貪欲の$ A_ {最大} $を選択します。

  しかし、我々が$ A_ {最大} $にこの番号を選択せず​​、$ a_l、A_R $これら2つの数値を選択する必要があります$ a_l + A_R> A_ {最大} $、ということも可能です。

  したがって、我々はまた、$ a_l + A_R-A_ {最大}考慮すべき系列に$する必要があります。

  その左と番号を削除する権利毎に、その左下とその右の位置で電流を記録するための2つの列の$ L、Rの$マークであってもよいです。

•コード

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  の#defineっ長い長
 4  の#define PLL対<-1,11,11->
 5  の#define F第
 6  の#define S第
 7  のconst  int型 MAXN = 1E5 + 50 8  
9  INT N。
10  LL [MAXN]。
11  のint L [MAXN]。
12  INT R [MAXN]。
13  セット <PLL> _set。
14  
15  空隙デル(int型X)
16  {
 17      _set.erase({[X]は、X})。
18      L [Rの[X] = L [X]。
19      R [Lの[X] = R [X]。
20  }
 21  LL)(解決
 22  {
 23      のためのint型 i = 1 ; iが<= N; ++ I)
 24      {
 25          L [I] =(I- 1 + N- 1)%N + 1 ;
26          R [I] =%I N + 1 27          _set.insert({[i]は、I})。
28      }
 29  
30      LL ANS = 0 31      のためにint型 i = 1 ; iが<= N / 3 ; ++ i)が
 32      {
 33の          ANSは+ = _set.rbegin() - > F。
34  
35          INT X = _set.rbegin() - > S。
36          のLL B = [Lの[X]]。
37          LLのC = [X]。
38          のLL D = [R [X]]。
39          
40          デル(L [X])。
41          デル(R [X])。
42          _set.erase({[X]は、X})。
43          
44          [X] = B + D- C。
45          _set.insert({[X]は、X})。
46      }
 47の     リターンANS。
48  }
 49  のint main()の
 50  {
 51      のscanf(" %d個"、&N)
52      のためにint型 i = 1 ; iが<= N ++ I)
 53          のscanf(" %のLLD "、A + I)。
54      のprintf(" %LLDする\ n " 、解決())。
55  
56      戻り 0 ;
57 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/violet-acmer/p/11724569.html