こんにちは、Kuniです。現在Javaを学習中で、Atcoderでコーディング力を高めているところです。
今回は競プロ典型90問 010-Score Sum Queries(★2)の実装にチャレンジしてみました。
ACのプログラム
Main.java
import java.util.*;
public class Main
{ //クラス名はMain
public static void main(String[] args) {
//標準入力受け取り準備
Scanner scanner = new Scanner(System.in);
//生徒の人数を受け取る
int N = scanner.nextInt();
//各生徒の点数を格納する配列を定義
int [][] number = new int[N][2];
for(int i = 0; i < N; i++){
//クラスと点数を読み込み
int c = scanner.nextInt();
int p = scanner.nextInt();
//累計を出す
//これまでのループの累計を格納
if(i != 0){
number[i][0] = number[i-1][0];
number[i][1] = number[i-1][1];
}
//今回のループの値を足す
if(c == 1){
//1クラスの
number[i][0] += p;
}else{
number[i][1] += p;
}
}
//Q個の質問を受け取る
int Q = scanner.nextInt();
//結果出力
for(int i = 0; i < Q; i++){
//スタート位置と終わりの位置を格納
int first = scanner.nextInt();
int last = scanner.nextInt();
//スタート位置が1番である時
if (first - 1 == 0) {
//終わりの位置の累計をそのまま出力
int sum1 = number[last - 1][0];
int sum2 = number[last - 1][1];
System.out.println(sum1 + " " + sum2);
}else{
//終わりの位置の累計からスタート位置までの累計を引いて出力
int sum1 = number[last - 1][0]- number[first - 2][0];
int sum2 = number[last - 1][1]- number[first - 2][1];
System.out.println(sum1 + " " + sum2);
}
}
scanner.close();
}
}
プログラムの方針
今回は生徒のクラスと点数が与えられ、その後各クラス学籍番号の範囲の人の点数の合計を求めるというものでした。そのため、各クラスの学籍番号〇番までの累計の点数を配列に格納することで指定された学籍番号の範囲の合計を出力しようとしました。
まず、クラスと点数が与えられるので、クラス毎に学籍番号〇番までの累計を配列に格納し保持しておきます。例えば配列の1番目には1番の点数、2番目には1,2番の点数の合計を保持します。
そして指定された学籍番号の範囲の点数の合計を出力するというステップにおいては、指定された範囲の後ろの学籍番号の累計から、前の学籍番号の1つ前の番号までの累計を引いて求めます。例えば学籍番号3番から6番の人の点数の合計を求めるという指定であれば、学籍番号1-6番までの累計から学籍番号1-2番の累計を引いて求めます。
参考になれば嬉しいです!!次は★3の問題に挑戦してみようと思います!