EX15 - 1.15 Editorial

Time Limit: 2 sec / Memory Limit: 256 MB

説明ページに戻る

問題文

三人兄弟のA君とB君とC君は、お父さんに1つのプレゼントを貰うことになりました。
貰えるプレゼントの予算は「テストの合計点の積」で決まります。

三人兄弟はそれぞれNN個のテストを受けました。
A君とB君とC君の「ii番目のテストの点数」をそれぞれAi,Bi,CiA_i, B_i, C_iで表すと、プレゼントの予算は次の式で求まります。
プレゼントの予算=(A1+A2++AN)×(B1+B2++BN)×(C1+C2++CN)プレゼントの予算 = (A_1 + A_2 + \cdots + A_N) \times (B_1 + B_2 + \cdots + B_N) \times (C_1 + C_2 + \cdots + C_N)

例えば、2個のテスト受けた結果、A君は55点と77点、B君は44点と1010点、C君は99点と22点だったとします。
この場合、(5+7)×(4+10)×(9+2)=12×14×11=1848(5 + 7) \times (4 + 10) \times (9 + 2) = 12 \times 14 \times 11 = 1848から、プレゼントの予算は18481848円になります。

A君はこの計算を行うプログラムを途中まで書きました。
A君が書いたプログラムに追記し、プログラムを完成させてください。

ページ末尾に問題のヒントがあります。詰まったら見てみましょう。


A君が書いたプログラム
Copy
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. // 1人のテストの点数を表す配列から合計点を計算して返す関数
  5. // 引数 scores: scores.at(i)にi番目のテストの点数が入っている
  6. // 返り値: 1人のテストの合計点
  7. int sum(vector<int> scores) {
  8. // ここにプログラムを追記
  9. }
  10.  
  11. // 3人の合計点からプレゼントの予算を計算して出力する関数
  12. // 引数 sum_a: A君のテストの合計点
  13. // 引数 sum_b: B君のテストの合計点
  14. // 引数 sum_c: C君のテストの合計点
  15. // 返り値: なし
  16. void output(int sum_a, int sum_b, int sum_c) {
  17. // ここにプログラムを追記
  18. }
  19.  
  20. // -------------------
  21. // ここから先は変更しない
  22. // -------------------
  23.  
  24. // N個の入力を受け取って配列に入れて返す関数
  25. // 引数 N: 入力を受け取る個数
  26. // 返り値: 受け取ったN個の入力の配列
  27. vector<int> input(int N) {
  28. vector<int> vec(N);
  29. for (int i = 0; i < N; i++) {
  30. cin >> vec.at(i);
  31. }
  32. return vec;
  33. }
  34.  
  35. int main() {
  36. // 科目の数Nを受け取る
  37. int N;
  38. cin >> N;
  39.  
  40. // それぞれのテストの点数を受け取る
  41. vector<int> A = input(N);
  42. vector<int> B = input(N);
  43. vector<int> C = input(N);
  44.  
  45. // それぞれの合計点を計算
  46. int sum_A = sum(A);
  47. int sum_B = sum(B);
  48. int sum_C = sum(C);
  49.  
  50. // プレゼントの予算を出力
  51. output(sum_A, sum_B, sum_C);
  52. }
#include <bits/stdc++.h>
using namespace std;

// 1人のテストの点数を表す配列から合計点を計算して返す関数
// 引数 scores: scores.at(i)にi番目のテストの点数が入っている
// 返り値: 1人のテストの合計点
int sum(vector<int> scores) {
  // ここにプログラムを追記
}

// 3人の合計点からプレゼントの予算を計算して出力する関数
// 引数 sum_a: A君のテストの合計点
// 引数 sum_b: B君のテストの合計点
// 引数 sum_c: C君のテストの合計点
// 返り値: なし
void output(int sum_a, int sum_b, int sum_c) {
  // ここにプログラムを追記
}

// -------------------
// ここから先は変更しない
// -------------------

// N個の入力を受け取って配列に入れて返す関数
// 引数 N: 入力を受け取る個数
// 返り値: 受け取ったN個の入力の配列
vector<int> input(int N) {
  vector<int> vec(N);
  for (int i = 0; i < N; i++) {
    cin >> vec.at(i);
  }
  return vec;
}

int main() {
  // 科目の数Nを受け取る
  int N;
  cin >> N;

  // それぞれのテストの点数を受け取る
  vector<int> A = input(N);
  vector<int> B = input(N);
  vector<int> C = input(N);

  // それぞれの合計点を計算
  int sum_A = sum(A);
  int sum_B = sum(B);
  int sum_C = sum(C);

  // プレゼントの予算を出力
  output(sum_A, sum_B, sum_C);
}

制約

  • 1N101≦N≦10
  • 0Ai,Bi,Ci1000≦A_i, B_i, C_i≦100
  • N,Ai,Bi,CiN, A_i, B_i, C_iは整数

入力

入力は次の形式で標準入力から与えられます。

NN
A1A_1 A2A_2 \cdots ANA_N
B1B_1 B2B_2 \cdots BNB_N
C1C_1 C2C_2 \cdots CNC_N

出力

プレゼントの予算を出力してください。

出力の最後には改行が必要です。


ジャッジでは以下の入力例以外のケースに関してもテストされることに注意。

入力例1Copy

Copy
2
5 7
4 10
9 2

出力例1Copy

Copy
1848

問題文で説明したケースです。


入力例2Copy

Copy
3
100 100 100
100 100 100
100 100 100

出力例2Copy

Copy
27000000

300×300×300=27000000300 \times 300 \times 300 = 27000000なので、三人兄弟は2700000027000000円分のプレゼントを貰えることになりました。


入力例3Copy

Copy
5
95 20 74 81 10
100 50 32 84 31
0 0 0 0 0

出力例3Copy

Copy
0

C君の合計点が00点だったので、プレゼントの予算も00円になります。


入力例4Copy

Copy
2
10 0
0 5
1 1

出力例4Copy

Copy
100

ヒント1

クリックでヒントを見る

今回の問題は今までの問題とは少し異なり、用意されたプログラムの動作を理解し、意図を読み取る必要があります。
プログラムがどのような順番で実行されていくかに注意して、A君が書いたプログラムを読んでみましょう。

ヒント2

この問題は「A君が書いたプログラムに追記して完成させる」という問題ですが、ヒントとして関数を使わずにこの問題と同じ処理をするプログラムを示します。このプログラムを参考にしてA君のsum関数とoutput関数を完成させてください。

クリックでヒントプログラムを見る

Copy
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int main() {
  5. // 科目の数Nを受け取る
  6. int N;
  7. cin >> N;
  8.  
  9.  
  10. // それぞれのテストの点数を受け取る
  11.  
  12. // N要素の配列A,B,Cを宣言
  13. vector<int> A(N), B(N), C(N);
  14.  
  15. // N個の入力をそれぞれ受け取る
  16. for (int i = 0; i < N; i++) {
  17. cin >> A.at(i);
  18. }
  19. for (int i = 0; i < N; i++) {
  20. cin >> B.at(i);
  21. }
  22. for (int i = 0; i < N; i++) {
  23. cin >> C.at(i);
  24. }
  25.  
  26.  
  27. // プレゼントの予算を出力
  28.  
  29. // テストの点数を表す配列から合計点を計算
  30. int sum_a = 0;
  31. for (int i = 0; i < A.size(); i++) {
  32. sum_a += A.at(i);
  33. }
  34. int sum_b = 0;
  35. for (int i = 0; i < B.size(); i++) {
  36. sum_b += B.at(i);
  37. }
  38. int sum_c = 0;
  39. for (int i = 0; i < C.size(); i++) {
  40. sum_c += C.at(i);
  41. }
  42.  
  43. // 3人の合計点からプレゼントの予算を計算して出力する
  44. cout << sum_a * sum_b * sum_c << endl;
  45. }
#include <bits/stdc++.h>
using namespace std;

int main() {
  // 科目の数Nを受け取る
  int N;
  cin >> N;


  // それぞれのテストの点数を受け取る

  // N要素の配列A,B,Cを宣言
  vector<int> A(N), B(N), C(N);

  // N個の入力をそれぞれ受け取る
  for (int i = 0; i < N; i++) {
    cin >> A.at(i);
  }
  for (int i = 0; i < N; i++) {
    cin >> B.at(i);
  }
  for (int i = 0; i < N; i++) {
    cin >> C.at(i);
  }


  // プレゼントの予算を出力

  // テストの点数を表す配列から合計点を計算
  int sum_a = 0;
  for (int i = 0; i < A.size(); i++) {
    sum_a += A.at(i);
  }
  int sum_b = 0;
  for (int i = 0; i < B.size(); i++) {
    sum_b += B.at(i);
  }
  int sum_c = 0;
  for (int i = 0; i < C.size(); i++) {
    sum_c += C.at(i);
  }

  // 3人の合計点からプレゼントの予算を計算して出力する
  cout << sum_a * sum_b * sum_c << endl;
}

ヒント3

output関数の部分のみ答えを示します。これを参考にsum関数を完成させてください。

クリックでヒントプログラムを見る

Copy
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. // 1人のテストの点数を表す配列から合計点を計算して返す関数
  5. // 引数 scores: scores.at(i)にi番目のテストの点数が入っている
  6. // 返り値: 1人のテストの合計点
  7. int sum(vector<int> scores) {
  8. // ここにプログラムを追記
  9. }
  10.  
  11. // 3人の合計点からプレゼントの予算を計算して出力する関数
  12. // 引数 sum_a: A君のテストの合計点
  13. // 引数 sum_b: B君のテストの合計点
  14. // 引数 sum_c: C君のテストの合計点
  15. // 返り値: なし
  16. void output(int sum_a, int sum_b, int sum_c) {
  17. cout << sum_a * sum_b * sum_c << endl;
  18. }
  19.  
  20. // -------------------
  21. // ここから先は変更しない
  22. // -------------------
  23.  
  24. // N個の入力を受け取って配列に入れて返す関数
  25. // 引数 N: 入力を受け取る個数
  26. // 返り値: 受け取ったN個の入力の配列
  27. vector<int> input(int N) {
  28. vector<int> vec(N);
  29. for (int i = 0; i < N; i++) {
  30. cin >> vec.at(i);
  31. }
  32. return vec;
  33. }
  34.  
  35. int main() {
  36. // 科目の数Nを受け取る
  37. int N;
  38. cin >> N;
  39.  
  40. // それぞれのテストの点数を受け取る
  41. vector<int> A = input(N);
  42. vector<int> B = input(N);
  43. vector<int> C = input(N);
  44.  
  45. // それぞれの合計点を計算
  46. int sum_A = sum(A);
  47. int sum_B = sum(B);
  48. int sum_C = sum(C);
  49.  
  50. // プレゼントの予算を出力
  51. output(sum_A, sum_B, sum_C);
  52. }
  53.  
#include <bits/stdc++.h>
using namespace std;

// 1人のテストの点数を表す配列から合計点を計算して返す関数
// 引数 scores: scores.at(i)にi番目のテストの点数が入っている
// 返り値: 1人のテストの合計点
int sum(vector<int> scores) {
  // ここにプログラムを追記
}

// 3人の合計点からプレゼントの予算を計算して出力する関数
// 引数 sum_a: A君のテストの合計点
// 引数 sum_b: B君のテストの合計点
// 引数 sum_c: C君のテストの合計点
// 返り値: なし
void output(int sum_a, int sum_b, int sum_c) {
  cout << sum_a * sum_b * sum_c << endl;
}

// -------------------
// ここから先は変更しない
// -------------------

// N個の入力を受け取って配列に入れて返す関数
// 引数 N: 入力を受け取る個数
// 返り値: 受け取ったN個の入力の配列
vector<int> input(int N) {
  vector<int> vec(N);
  for (int i = 0; i < N; i++) {
    cin >> vec.at(i);
  }
  return vec;
}

int main() {
  // 科目の数Nを受け取る
  int N;
  cin >> N;

  // それぞれのテストの点数を受け取る
  vector<int> A = input(N);
  vector<int> B = input(N);
  vector<int> C = input(N);

  // それぞれの合計点を計算
  int sum_A = sum(A);
  int sum_B = sum(B);
  int sum_C = sum(C);

  // プレゼントの予算を出力
  output(sum_A, sum_B, sum_C);
}


テスト入出力

書いたプログラムがACにならず、原因がどうしてもわからないときだけ見てください。

クリックでテスト入出力を見る

テスト入力1
10
2 8 3 1 10 8 32 15 9 100
5 1 2 0 3 2 1 10 43 20
0 100 7 10 0 82 19 0 90 51
テスト出力1
5871804


解答例

必ず自分で問題に挑戦してみてから見てください。

クリックで解答例を見る

Copy
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. // 1人のテストの点数を表す配列から合計点を計算して返す関数
  5. // 引数 scores: scores.at(i)にi番目のテストの点数が入っている
  6. // 返り値: 1人のテストの合計点
  7. int sum(vector<int> scores) {
  8. int s = 0;
  9. for (int i = 0; i < scores.size(); i++) {
  10. s += scores.at(i);
  11. }
  12. return s;
  13. }
  14.  
  15. // 3人の合計点からプレゼントの予算を計算して出力する関数
  16. // 引数 sum_a: A君のテストの合計点
  17. // 引数 sum_b: B君のテストの合計点
  18. // 引数 sum_c: C君のテストの合計点
  19. // 返り値: なし
  20. void output(int sum_a, int sum_b, int sum_c) {
  21. cout << sum_a * sum_b * sum_c << endl;
  22. }
  23.  
  24. // -------------------
  25. // ここから先は変更しない
  26. // -------------------
  27.  
  28. // N個の入力を受け取って配列に入れて返す関数
  29. // 引数 N: 入力を受け取る個数
  30. // 返り値: 受け取ったN個の入力の配列
  31. vector<int> input(int N) {
  32. vector<int> vec(N);
  33. for (int i = 0; i < N; i++) {
  34. cin >> vec.at(i);
  35. }
  36. return vec;
  37. }
  38.  
  39. int main() {
  40. // 科目の数Nを受け取る
  41. int N;
  42. cin >> N;
  43.  
  44. // それぞれのテストの点数を受け取る
  45. vector<int> A = input(N);
  46. vector<int> B = input(N);
  47. vector<int> C = input(N);
  48.  
  49. // それぞれの合計点を計算
  50. int sum_A = sum(A);
  51. int sum_B = sum(B);
  52. int sum_C = sum(C);
  53.  
  54. // プレゼントの予算を出力
  55. output(sum_A, sum_B, sum_C);
  56. }
#include <bits/stdc++.h>
using namespace std;

// 1人のテストの点数を表す配列から合計点を計算して返す関数
// 引数 scores: scores.at(i)にi番目のテストの点数が入っている
// 返り値: 1人のテストの合計点
int sum(vector<int> scores) {
  int s = 0;
  for (int i = 0; i < scores.size(); i++) {
    s += scores.at(i);
  }
  return s;
}

// 3人の合計点からプレゼントの予算を計算して出力する関数
// 引数 sum_a: A君のテストの合計点
// 引数 sum_b: B君のテストの合計点
// 引数 sum_c: C君のテストの合計点
// 返り値: なし
void output(int sum_a, int sum_b, int sum_c) {
  cout << sum_a * sum_b * sum_c << endl;
}

// -------------------
// ここから先は変更しない
// -------------------

// N個の入力を受け取って配列に入れて返す関数
// 引数 N: 入力を受け取る個数
// 返り値: 受け取ったN個の入力の配列
vector<int> input(int N) {
  vector<int> vec(N);
  for (int i = 0; i < N; i++) {
    cin >> vec.at(i);
  }
  return vec;
}

int main() {
  // 科目の数Nを受け取る
  int N;
  cin >> N;

  // それぞれのテストの点数を受け取る
  vector<int> A = input(N);
  vector<int> B = input(N);
  vector<int> C = input(N);

  // それぞれの合計点を計算
  int sum_A = sum(A);
  int sum_B = sum(B);
  int sum_C = sum(C);

  // プレゼントの予算を出力
  output(sum_A, sum_B, sum_C);
}



2025-04-05 (Sat)
00:41:57 +00:00