Time Limit: 2 sec / Memory Limit: 256 MB
問題文
N人のテストの点数が与えられます。
それぞれの人の点数が平均点から何点離れているか計算してください。
平均点は次の式で求められます。i番目の人の点数はA_iで表します。
平均点 = \frac{A_1 + A_2 + \cdots + A_N}{N}
平均点が整数にならない場合、小数点以下を切り捨てた数値を平均点とします。
例えば3人のテストの点数が「2点、1点、4点」だったとき、\frac{2 + 1 + 4}{3} = 2.333 \cdotsなので、平均点は小数点以下を切り捨てて2点になります。
そして、平均点から何点離れているかを計算した結果である「0点、1点、2点」が答えになります。
「0点、-1点、2点」でも「0点、1点、-2点」でも無いことに注意してください。
ページ末尾に問題のヒントがあります。詰まったら見てみましょう。
サンプルプログラム
#include <bits/stdc++.h> using namespace std; int main() { int N; cin >> N; }
制約
- 1≦N≦1000
- 0≦A_i≦100
- N, A_iは整数
入力
入力は次の形式で標準入力から与えられます。
N A_1 A_2 \cdots A_N
出力
それぞれの人の点数が平均点から何点離れているかを1行ずつ出力してください。
1人目の計算結果 2人目の計算結果 \vdots N人目の計算結果
出力の最後には改行が必要です。
ジャッジでは以下の入力例以外のケースに関してもテストされることに注意。
入力例1
3 2 1 4
出力例1
0 1 2
問題文中で説明した入出力です。
入力例2
2 80 70
出力例2
5 5
このケースの平均点は75点です。
どちらの点数も平均点から5点離れています。
入力例3
5 100 100 100 100 100
出力例3
0 0 0 0 0
このケースの平均点は100点です。
入力例4
10 53 21 99 83 75 40 33 62 18 100
出力例4
5 37 41 25 17 18 25 4 40 42
ヒント
今回の問題は次のプログラムに追記すれば解くことができます。
追記箇所が2つあることに注意してください。
#include <bits/stdc++.h> using namespace std; int main() { int N; cin >> N; // N要素の配列 vector<int> A(N); // 入力処理 for (int i = 0; i < N; i++) { cin >> A.at(i); } // 合計点 int sum = 0; // 合計点を計算 for (int i = 0; i < N; i++) { // ①ここにプログラムを追記 } // 平均点 int mean = sum / N; // 平均点から何点離れているかを計算して出力 for (int i = 0; i < N; i++) { // ②ここにプログラムを追記 // 負の数を出力しないように注意 } }
テスト入出力
書いたプログラムがACにならず、原因がどうしてもわからないときだけ見てください。
クリックでテスト入出力を見る
テスト入力1
1 80
テスト出力1
0
テスト入力2
データが大きすぎるため省略
解答例
必ず自分で問題に挑戦してみてから見てください。
クリックで解答例を見る
#include <bits/stdc++.h> using namespace std; int main() { int N; cin >> N; // N要素の配列 vector<int> A(N); // 入力処理 for (int i = 0; i < N; i++) { cin >> A.at(i); } // 合計点 int sum = 0; // 合計点を計算 for (int i = 0; i < N; i++) { // ①ここにプログラムを追記 sum += A.at(i); } // 平均点 int mean = sum / N; // 平均点から何点離れているかを計算して出力 for (int i = 0; i < N; i++) { // ②ここにプログラムを追記 // 負の数を出力しないように注意 if (A.at(i) > mean) { cout << A.at(i) - mean << endl; } else { cout << mean - A.at(i) << endl; } } }