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

ARC-015-B 真冬日?真夏日?

■■■問題■■■

夏になると「真夏日」や「熱帯夜」などをよく耳にしますが、
実際には次のように予報用語が定義されています。

1. 猛暑日:最高気温が35度以上の日
2. 真夏日:最高気温が30度以上、35度未満の日
3. 夏日 :最高気温が25度以上、30度未満の日
4. 熱帯夜:最低気温が25度以上の日
5. 冬日 :最低気温が 0度未満で、最高気温が0度以上の日
6. 真冬日:最高気温が 0度未満の日

いま、ある地点での日毎の最高気温と最低気温の観測結果が与えられます。
このとき、上述した猛暑日、真夏日、夏日、熱帯夜、冬日、真冬日は
それぞれ何日ずつあったかを出力してください。

ただし、ここでの「気温」とは、摂氏のことを表します。
複数の予報用語に属する日が存在することに注意してください。 

■■■入力■■■

N
MT1 mT1
MT2 mT2
・
・
・
MTN mTN

●1行目に、観測日数を表す整数N (1 <= N <= 3650) が1行で与えられる。
●2行目から N+1 行目まで、観測結果がN行で与えられ、
  i (1 <= i <= N) 日目の観測結果は以下の意味を持つ。
  ●i日目の最高気温はMTi 、最低気温はmTiで、それぞれ摂氏である。
  ●MTiとmTiは、-90.0 <= mTi <= MTi <= 60.0 を満たし、多くても小数第1位までしか存在しない。

■■■出力■■■

猛暑日・真夏日・夏日・熱帯夜・冬日・真冬日の日数を、半角スペース区切りで1行で出力せよ。
なお、出力の順序は前述の通りで、最後には改行をいれること。 


C#のソース

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

class Program
{
    static string InputPattern = "InputX";

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

        if (InputPattern == "Input1") {
            WillReturn.Add("4");
            WillReturn.Add("32.2 25.3");
            WillReturn.Add("36.4 26.4");
            WillReturn.Add("24.1 18.0");
            WillReturn.Add("26.0 24.9");
            //1 1 1 2 0 0
            //●1日目は最高気温が32.2度で、最低気温が25.3度です。この日は真夏日かつ熱帯夜です。
            //●2日目は最高気温が36.4度で、最低気温が26.4度です。この日は猛暑日かつ熱帯夜です。
            //●3日目は最高気温が24.1度で、最低気温が18.0度です。この日はいずれにも該当しません。
            //●4日目は最高気温が26.0度で、最低気温が24.9度です。この日は夏日です。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("3");
            WillReturn.Add("-2 -5.2");
            WillReturn.Add("2 -0.1");
            WillReturn.Add("26.0 -0.1");
            //0 0 1 0 2 1
            //●1日目は最高気温が-2度で、最低気温が-5.2度です。この日は真冬日です。
            //●2日目は最高気温が 2度で、最低気温が-0.1度です。この日は冬日です。
            //●3日目は最高気温が26.0度で、最低気温が-0.1度です。この日は夏日かつ冬日です。
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("4");
            WillReturn.Add("5.0 9.5");
            WillReturn.Add("2.5 10.5");
            WillReturn.Add("0.5 19.9");
            WillReturn.Add("5.5 15.5");
            //0 0 0 0 0 0
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();

        decimal[] wkArr = { };
        Action<string> SplitAct = pStr =>
            wkArr = pStr.Split(' ').Select(X => decimal.Parse(X)).ToArray();

        int[] CntArr = new int[7];
        foreach (string EachStr in InputList.Skip(1)) {
            SplitAct(EachStr);

            //猛暑日:最高気温が35度以上の日
            if (wkArr[0] >= 35M) CntArr[1]++;

            //真夏日:最高気温が30度以上、35度未満の日
            if (wkArr[0] >= 30M && wkArr[0] < 35M) CntArr[2]++;

            //夏日 :最高気温が25度以上、30度未満の日
            if (wkArr[0] >= 25M && wkArr[0] < 30M) CntArr[3]++;

            //熱帯夜:最低気温が25度以上の日
            if (wkArr[1] >= 25M) CntArr[4]++;

            //冬日 :最低気温が0度未満で、最高気温が0度以上の日
            if (wkArr[1] < 0M && wkArr[0] >= 0M) CntArr[5]++;

            //真冬日:最高気温が0度未満の日
            if (wkArr[0] < 0M) CntArr[6]++;
        }
        string[] AnswerArr =
            Array.ConvertAll(CntArr.Skip(1).ToArray(), X => X.ToString());
        Console.WriteLine(string.Join(" ", AnswerArr));
    }
}


解説

順に条件を判断してます。