羅区P2672のセールスマン(貪欲、シミュレーション)

ポータル


問題解決のためのアイデア

最初

 

私は家の選挙のために、それは家族の前にI-1の値が選ぶだろうことは明らかである、我々は唯一の選挙法の最後を検討する必要が。(問題sの)私の大きな値を選択するかの最大の残りの値を選択します。

我々は、[i]は、I最古MAXSフロントを値の降順に係るいくつかの構造体にそれぞれ(SおよびA)の状況を持って、その後和とプレフィックスを取得しますMAXAとSは、[i]が最大値、すなわち、(S * 2 + a)の最大値を選択した家族のI ... Nを表します。

そして、各I要件については、ANS [i]が

  • 私の前の家の最大値を選択してください
  • 家族の残りの部分を追加する前に、I-1の最大値を選択してくださいホーム私... nは家への最大の貢献

最大値、すなわち、

ANS [I] = MAX(和[I] + 2 * MAXS [i]は、和[I-1] + MAXA [I]))。

第二:

もちろん、記録ANS答えをので、インクリメントANS iを増加させながら、それぞれの時間は、番号を追加します。

すべての選択肢について、2例に分けることができ、1つの最も遠いアドレスは以下のようになります。

  • 最大値になりました。<アドレスを選択しているK、[K]に対する答えの貢献
  • 選択したアドレス>今の最大の貢献そのk個の回答、[K] + 2 *への回答の貢献(S [k]は-now)

だから、それぞれが最大を取ることができます。

ここでは、2つの大きなスタックとは、より便利に実現しています。

Q1点はQ2は今正しい場所に格納され、今で左に格納されます。

右への更新ポイントは、その後、ポップQ2、Q1に移動した場合、今の間にすべての点の座標を追加し、座標q2.topを()、そして今、最後に更新された値。

更新は左のポイントである場合、単にポップq1は、Q2は扱われません。

したがって、Q2が行われる各時点で、今よりも小さい座標点の全てを排出する必要があります。

ACコード

1の#include <iostreamの>
 2の#include <アルゴリズム>
 3の#include <cmath>
 4の#include <cstdioを>
 5  使って 名前空間STD。
6  のconst  int型 MAXN = 100005 7  int型N、MAXS [MAXN]、MAXA [MAXN]。
8  構造体ノード{
 9つの     int型S;
10      ブール 演算子 <(constのノード&XX){
 11          リターン A> xx.a。
12      }
 13  } [MAXN]×。
14  INT和[MAXN]。
15  のint main()の
 16  {
 17      CIN >> N。
18      のためにint型 i = 1 ; iが<= N; iが++ ){
 19          のscanf(" %dの"、およびX [i]は.S)。
20      }
 21      のためのint型 i = 1 ; iが<= N; iが++ ){
 22          のscanf(" %dの"、およびX [I] .A)。
23      }
 24      ソート(X + 1、X + N + 1 )。
25     以下のためにint型 i = 1 ; iが<= N; iは++ ){
 26          和[i]は=合計を[I- 1 ] + X [i]は.A。
27          MAXS [I] = MAX(MAXS [I- 1 ]、X [i]は.S)。
28      }
 29      のためのint型 I = N; I> = 1 ; i-- ){
 30          MAXA [I] = MAX(MAXA [I + 1 ]、2 * X [i]は.S + X [i]は.A)。
31      }
 32      のためのint型 i = 1 ; iがn = <; iは++ ){
 33          のprintf(" %Dの\ nを"は、MAX(SUM [I] + 2 * MAXS [i]は、和[I- 1 ] + MAXA [I]));
 34      }
 35      リターン 0 ;
 36 }
最初の
1の#include <iostreamの>
 2の#include <cstdioを>
 3の#include <アルゴリズム>
 4の#include <キュー>
 5  使って 名前空間STDを、
6  のconst  int型 MAXN = 100005 7  INT N。
8つの 長い 長いANS;
9  構造体ノード{
 10      INT S。
11      のint ;
12      ブール 演算子 <(constのノード&P)のconst {
 13の         リターン 2 *のS + <PS * 2+ PAを。
14      }
 15  } D [MAXN]。 
16 PRIORITY_QUEUE < 整数 > Q1。
17 PRIORITY_QUEUE <ノード> Q2。 
18  ボイドshuchu(){
 19      のprintf(" %LLDする\ n " 、ANS)。
20  }
 21  INT メイン(){
 22      CIN >> N。
23      のためにint型 i = 1 ; iが<= N; iが++ ){
 24          のscanf(" %dの"、&D [i]の.S)。
25      }
26      のためにint型 i = 1 ; iが<= N; iが++ ){
 27          のscanf(" %dの"、&D [i]の.A)。
28      }
 29      のためのint型 i = 1 ; iが<= N; iが++ ){
 30          q2.push(D [I])。
31      }
 32      INTは今= 0 33      のためにint型 i = 1 ; iが<= N; iが++ ){
 34          、ノードD2。
35          であれば(!q2.empty()){
 36             D2 = q2.top()。
37              一方(d2.s <今&& q2.empty()!)q2.pop()、D2 = q2.top()。
38          }
 39          であれば(q1.empty()){
 40              、ノードD2 = q2.top()。
41              q2.pop()。
42              今= d2.s。
43の              ANS + = d2.a + 2 * d2.s- 2 * 今。
44              shuchu()。
45              続け;
46          }
 47          であれば(q2.empty()){
 48              INT D1 = q1.top()。
49             q1.pop();
50の              ANS + = D1。
51              shuchu()。
52              続け;
53          }
 54          INT D1 = q1.top()。
55          int型 D22 = d2.a + 2 * d2.s- 2 * 今、
56          であれば(D1> D22){
 57              q1.pop()。
58の              ANS + = D1。
59          } {
 60              q2.pop()。
61              今= d2.s。
62              ANS + =D22;
 63である         }
 64          shuchu();
 65      }
 66      リターン 0 ;
 67 }
第2

// NOIP2015人気グループT4

おすすめ

転載: www.cnblogs.com/yinyuqin/p/11762167.html