トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

ABC-031-B 運動管理

■■■問題■■■

高橋君はAtCoder社のマスコットキャラクターである。

マスコットキャラクターとしての魅力を維持するために、
高橋君は適度な運動をすることになっている。
高橋君は週の運動時間がL分以上H分以下でなければならない。

しかしながら、青木君は最近、高橋君が運動しているところを見ていない。
高橋君の運動状況が気になった青木君は、
高橋君の過去N週間の運動時間が制限にあっているのか、
そして足りないなら少なくともあと何分運動する必要があったのかを計算するプログラムを作成することにした。

■■■入力■■■

L H
N
A1
A2
・・・
AN


●1行目には、2個の整数 L, H(1 <= L <= H <= 1万) が空白区切りで与えられる。
  これは、高橋君が週に L分以上H分以下の運動をしなければならないことを表す。
●2行目には、整数 N(1 <= N <= 50) が与えられる。
  これは青木君が N週分の運動時間について調べていることを表す。
●3行目からのN行には、高橋君の運動状況を表す整数が与えられる。
  N 行の内i(1 <= i <= N)行目には、整数Ai(0 <= Ai <= 1万) が与えられる。
  これはi個前の週において高橋君がAi分運動したことを表す。

■■■出力■■■

出力はN行からなる。i(1 <= i <= N)行目には、
i個前の週において高橋君が必要な分よりも多く運動している場合は-1を、
そうでない場合は追加で必要な運動時間の最小値を分単位で1行に出力せよ。

出力の末尾にも改行を入れること。


C#のソース

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static string InputPattern = "Input1";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("300 400");
            WillReturn.Add("3");
            WillReturn.Add("240");
            WillReturn.Add("350");
            WillReturn.Add("480");
            //60
            //0
            //-1
            //青木君は3個の週について調査している。
            //1個前の週において、高橋君は240分運動しており、これは運動時間の下限である300分に満たない。
            //高橋君はあと60分追加で運動する必要があるため、1行目には60を出力する。
            //2個前の週において、高橋君は350分運動しており、これは運動時間の制限に適している。
            //そのため、2行目には0を出力する。
            //3個前の週において、高橋君は480分運動しており、これは運動時間の上限である400分を越えており、
            //運動しすぎである。そのため、3行目には-1を出力する。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("50 80");
            WillReturn.Add("5");
            WillReturn.Add("10000");
            WillReturn.Add("50");
            WillReturn.Add("81");
            WillReturn.Add("80");
            WillReturn.Add("0");
            //-1
            //0
            //-1
            //0
            //50
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        int[] wkArr = InputList[0].Split(' ').Select(X => int.Parse(X)).ToArray();
        int L = wkArr[0];
        int H = wkArr[1];

        int[] AArr = InputList.Skip(2).Select(X => int.Parse(X)).ToArray();

        foreach (int EachA in AArr) {
            if (EachA < L) {
                Console.WriteLine(L - EachA);
            }
            if (L <= EachA && EachA <= H) {
                Console.WriteLine(0);
            }
            if (H < EachA) {
                Console.WriteLine(-1);
            }
        }
    }
}


解説

3通りの大小関係のどれかをif文で判定してます。