ファーマージョンは、いくつかの木材をカットするために行って、左に N (2≤ Nを いつものように、草を食べる牛10万≤)。彼が戻ってきたとき、彼は牛のクラスタが彼の庭で彼の美しい花を食べていたことを彼の恐怖に発見しました。その後の被害を最小限にしたい、FJはすぐに行動を取ると、自身の納屋に各牛をバック輸送することを決めました。
各牛 iが ある場所であり 、T iは、 分(1≤ T iが 2,000,000を以下)離れた独自の納屋から。輸送を待っている間にさらに、彼女は破壊 D I (1つの≤の D 私は 毎分100≤)花を。どんなに彼がしよういかに難しいか、FJは戻って彼女の納屋に一度に一つの牛を輸送することはできません。牛を移動する 私は その納屋には、2×必要で T I (分T 私は そこに取得すると T 私は 返すように)。FJは、花のパッチで始まり、その納屋に牛を輸送し、再び花を歩く、輸送を必要とする次の牛を得るために余分な時間を割いていません。
FJが破壊された花の数が最小になるように牛をピックアップする順序を決定するためのプログラムを書きます。
入力
行1:単一の整数
N
行2 .. N +1:各ラインは、2つのスペースで区切られた整数を含む、 T I および D Iは 、単一の牛の特性を記述
行2 .. N +1:各ラインは、2つのスペースで区切られた整数を含む、 T I および D Iは 、単一の牛の特性を記述
出力
行1:破壊された花の最小数であり、単一の整数
サンプル入力
6 3 1 2 5 2 3 3 2 4 1 1 6
サンプル出力
86
ヒント
FJは、次の順序で牛を返す:6、2、3、4、1、5、彼は納屋に牛6を輸送している間、他は24個の花を破壊します。次の彼は、彼の美しい植物相の28以上を失って、牛2がかかります。牛3、4の場合、1彼は、それぞれ16、12、及び6の花を失います。彼は牛5を選ぶときにそこに花を損傷し、それ以上の牛ではないので、その牛のための損失はゼロです。このようにして失われた総花は24 + 28 + 16 + 12 + 6 = 86です。
考え:最初の放牧最も効率的な(D / T)、次のコードから選択貪欲質問:
typedefの長い 長いLL。 const int型 MAXM = 100005 ; 構造体ノード{ int型のT、D。 ブール 演算子 <(constのノード&A)のconst { リターン(AD * 1.0)/ AT <D * 1.0 / T。 } } [MAXM]ノード。 int型のn; LL時間 = 0、合計= 0 ; INT メイン(){ scanf関数(" %のD "、&N) にとって(int型 I = 0 ; iがN <; ++ i)が{ scanf関数(" %のLLD%dの"、およびノード[i]は.T、およびノード[I] .D)を、 } ソート(ノード、ノード + N)。 用(int型 I = 0 ; iがN <; ++ i)が{ 和 + =ノード[I] .Dは* 回; 時間 + =ノード[I] .T * 2 。 } のprintf(" %LLDする\ n " 、合計)。 リターン 0 ; }