ソーティングの最小コスト(置換基)

スイッチング素子Iの任意の2つの位置のJ次に、あなたのシーケンスS = {A1、A2 ...... AN}を与えるために、費用AI + AJは、順序付けられたシーケンスに、最小コストを見つけます。

アイデア:順列グループの独創的なアプリケーション 

4327165ペイント例で

3つのリングがあります。

4-> 7-> 5-> 1-> 4

3-> 2-> 3

6-> 6

それは他の要素を移動する最小の要素とリングに、最小のコストを必要とします

コスト:Σwi+(N-2)*分(WI)

計算された検討を加えた後、各リングのコストであります

しかし、反例があり、それは時々、外側リング要素を借りて低コストとすることができます

借入費用のコストアップ:2 *(MIN(WI)+ X)// xは、シーケンス全体の最小の要素であります 

コスト削減は、(N-1)*(MIN(WI)-x)

- (N-1)*(MIN(WI)-x)=Σwi+分(WI)Σwi(N-2)*分(WI)+ + 2 *(MIN(WI)+ X):この時の総コストで+(N + 1)* X

概要:最小コストを求めているが、両方のケースでは最小の要素によって全体として考慮すべき要素を躊躇しませんでした

書式#include <iostreamの> 
の#include <アルゴリズム>
 使用して 名前空間はstdを、
const  int型 INF = 0x3f3f3f3f const  int型 MAXN = 100100 ;
INT [MAXN]、[MAXN] B、T [MAXN]、N、ミネソタ州。
BOOL VIS [MAXN]。
INT )(解決{
     INT ANS = 0 
  //枚举每个环
ためint型 i = 0 ; iがn <; iは++ ){ 場合(VIS [i])と続けますint型 CUR = I、合計= 0 ; int型 =ミニinfファイル。 int型のk = 0 一方、1 ){ K ++ あなたの[理由] = 1 ; int型、Yは= [理由]。 合計 + = V; ミニ = 分(ミニ、V); なぜ = T [V]。 もし(あなたの[理由])ブレーク } 回答 - + =分(私は(K + 2)*ミニ、ミニ+ I +(K + 1)*をミネソタ州); } 戻りANS。 } int型のmain(){ CIN >> N。 ミネソタ州 = infファイル。 以下のためにint型 i = 0 ; iがn <; iは++ ){ CIN >> [I]。 B [i]は = [I]。 VIS [I] = 0 ; ミネソタ州 = 分(ミネソタ州、[I])。 } ソート(B、B + N)。 以下のためにint型 i = 0 ; iがn <; iは++)T [B [I] = I。 int型ANS = (解きます)。 coutの << ANS << てendl; リターン 0 ; }

例:http://poj.org/problem?id=3270

おすすめ

転載: www.cnblogs.com/wronin/p/11352411.html