[貪欲]水ライン接続
タイトル説明
個人的な接触の水道水の前にN-lineは、地下水はその都度T_Iは、このプログラミング個々のキューnはシーケンシャルで、その結果、n個の個々の最小平均待ち時間を見つけてください場合。
入力形式
最初の整数nを行います。
第二行nは整数、iはT_I個々の待機時間T Iを表す最初の整数。
出力フォーマット
(二小数点の後に正確な出力結果)は、第2の実施形態において、このような動作が配置されている平均待ち時間、出力ファイルには、2つの行、平均最短時間キューを有する一次挙動を有します。
サンプル入力と出力
入力#1レプリケーション
10
56 12である1,991,000,234,335,599,812ある
出力#1複製
32781496105
291.90
取扱説明書/ヒント、
n≤1000、TI≤10^ 6は、TIは、非繰り返しを保証するものではありません。TIは、入力された順序に従って反復される場合(ソートが可能です)
分析
元の数を維持する必要性は、構造体に格納されたデータを開きます。プレス小さなから大規模までの待ち時間
(ここではリードレイテンシビット、時間があまりにも容易に人が待つ必要があるとして。感謝される)
を意味題さ
まず、最初の人の水を、その後に第2のn人々がそう、[1]秒を待たなければなりません合計待機時間は、[1] *(Nである 1)。
同様に、二人目は、その後水は、第3のn個体に彼は、[2] Sの後方合計時間を加えた[2] *(N-待たなければならない 2)。
各個人について、残留みんなの存在が彼の時間のキックを経験しなければなりません。
つまり、それぞれの人が彼の後ろと誰もが彼の時間を待つ必要があるので、入って来た彼自身の時間、待つません。(いいえ...どのように間違って再生する方法を始めと疑問に思います)
コード
#include<iostream>
#include<cstdio>
using namespace std;
#include<algorithm>
int n;
//int t[1005];
struct data{
int t;
int num;
}d[1005];
bool cmp(data a,data b){
return a.t < b.t;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>d[i].t;
d[i].num =i;
}
sort(d+1,d+n+1,cmp);
double cnt1=0,cnt2=0;
for(int i=1;i<=n;i++){
cout<<d[i].num<<" ";
cnt1 += d[i].t;
cnt2 += cnt1 -d[i].t;
// cnt1 +=d[i].t * (n-i); //也可以把上两句 注释掉,用 公式来。
}
printf("\n");
printf("%.2f",cnt2/n);
return 0;
}