トピックリンク:LightOJ - 1027
説明
あなたは迷路です。見て\(N \)初めに、あなたの目の前でドアを。あなたが好きなドアを選択することができます。ドアを選択する確率は、すべてのドアのために同じです。
あなたが選択した場合は、\(私は^ {番目} \)のドアを、それが戻ってあなたが始まっ同じ位置に行くことができますいずれか\(X_I \)分、または後迷路のあなたを取ることができます\(X_I \)分。あなたが同じ位置に戻ってきた場合、あなたは何も覚えていないことができます。だから、あなたが開始位置に来るたびに、あなたは何の過去の経験を持っていません。
今、あなたは迷路から抜け出すための予想時間を見つけたいです。
入力
入力は、整数で始まり\(T(100≤)\)テストケースの数を表します。
それぞれの場合は空白行と整数含有する(N(1≤N≤100)\)\のドアの数を表します。次の行は、n個のスペースで区切られた整数が含まれています。場合は\(I ^ {番目} \)の整数\((X_I)が\)正である、あなたがいると仮定することができます\(I ^ {番目は} \)ドアが後迷路の外に行くことができます\(X_I \)分。それは否定的だ場合は、\(I ^ {thは} \)ドアは後にバック開始位置に移動します\(ABS(X_I)\)分。あなたは安全と仮定することができます(10000 \≤1つの≤ABS(X_I))\を。
出力
それぞれのケースについて、迷路から抜け出すためにケース番号と予想される時間を印刷します。それは迷路、印刷「から抜け出すことは不可能だ場合は\(INF \)」。で結果を印刷します\(P / Q \)形式。どこに\(のp \)は、結果の分子であると\(q個の\は)結果の分母であり、彼らは互いに素です。詳細については、サンプルを参照してください。
サンプル入力
3
1
1
2
-10 -3
3
3 -6 -9
サンプル出力
Case 1: 1/1
Case 2: inf
Case 3: 18/1
解決
問題の意味
あなたはそれの前に、迷路内にある\(N \)最初の場合、ドア\(私は\)ドア\(X_I \)が正である、あなたが過ごすことができます(X_I \)\時間の迷路の外に、そうでない場合過ごす\(ABS(X_I)\)振り出しに戻った時間を、ドアの前に来たものを覚えていません。等しい確率で各ドアを選択するために、時間の迷路のうち期待が尋ねます。あなたは、出力外出することはできません\(INF \)を。
考え
(N_1の\の)\迷路から抜け出すためにドア、\(およびN_2 \) 、迷路の外にすることはできません\(= N-のN_1とN_2 + \) 。
セット\(N_1の\の)ドア\(X_I \)の値の平均\(T_L \)、\ (およびN_2 \)ドア\(X_I \)の値の平均\(T_2 \) 。
以下のために期待を外出するように設定し\(E \) 。\(E = \ {N_1のN-FRAC {}} \ + CDOT \ CDOT T_L \ N-FRAC {} {}及びN_2(T_2 + E)\)。
後に還元\(E = \ {N_1のFRAC。1} {} \ sum_ = {I}。1 ^ N-ABS(X_I)\)。
コード
#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
int x[maxn];
int gcd(int a, int b) {
return a == 0? b: gcd(b % a, a);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin >> T;
int kase = 0;
while(T--) {
int n;
cin >> n;
int sum = 0;
int cnt = 0;
for(int i = 1; i <= n; ++i) {
cin >> x[i];
if(x[i] > 0) {
++cnt;
sum += x[i];
} else {
sum += -x[i];
}
}
int d = gcd(sum, cnt);
if(cnt == 0) printf("Case %d: inf\n", ++kase);
else printf("Case %d: %d/%d\n", ++kase, sum / d, cnt / d);
}
return 0;
}