スイッチング素子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 ; }