ねむーの日記~AtCoderな日々~

福岡に住むプログラミング好きのブログです!

【プログラミングコンテスト】全国統一プログラミング王決定戦予選①

そろそろ大学院の期末試験近づいてきました(焦)、ねむーです。

今回はAtCoder(https://atcoder.jp/contests/nikkei2019-qual)にて開催されました、全国統一プログラミング王決定戦予選に参加してきました!。

今回は、第一問「A - Subscribers」の問題と僕との戦闘記です。

0.はじめに

今回、プログラミング言語C#を使用しています。

1.問題文

私たちは、新聞の購読に関する調査を行いました。 具体的には、調査の対象者 N 人に対し、それぞれ次の 2 つの質問を行いました。

質問 1 : あなたは新聞 X を購読しているか? 質問 2 : あなたは新聞 Y を購読しているか? その結果、質問 1 に対して「はい」と回答した人の数は A 人、質問 2 に対して「はい」と回答した人の数は B 人でした。

このとき、調査の対象者のうち新聞 X, Y の両方を購読している人の数は最大で何人であり、また最小で何人であると考えられるでしょうか?

この問いに答えるプログラムを書いてください。

2.入力例

入力

入力は以下の形式で標準入力から与えられる。

N  A  B

出力

両方の新聞を購読している人の数として考えられる最大の人数と最小の人数をこの順に、空白で区切って出力せよ。

入力例 1

10 3 5

出力例 1

3 0

この例では、調査の対象者 10 人のうち 3 人が新聞 X を購読していると回答し、 5 人が新聞 Y を購読していると回答しています。

このとき、両方の新聞を購読している人の数は最大で 3 人、最小で 0 人です。

入力例 2

10 7 5

出力例 2

5 2

この例では、調査の対象者 10 人のうち 7 人が新聞 X を購読していると回答し、 5 人が新聞 Y を購読していると回答しています。

このとき、両方の新聞を購読している人の数は最大で 5 人、最小で 2 人です。

入力例 3

100 100 100

出力例 3

100 100

3.初見の感想

  • 入力の分割とパースが必要
  • 最大値となるのは下のような状態。2つの小さい方の数値を求めればよい f:id:nemurin_blog:20190128015635p:plain
  • 最小値は下のような状態。つまりどちらもNOの人がいない状態。 f:id:nemurin_blog:20190128015305p:plain

    4.実際解いた時の感想

    特に問題なく10分ぐらいで解けました!

    5.コード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

    class Program
    {
        static void Main(string[] args)
        {
        string[]input=System.Console.ReadLine().Split(' ');
        int N_PeopleNum = int.Parse(input[0]);
        int A_Q1 = int.Parse(input[1]);
        int B_Q2 = int.Parse(input[2]);
        System.Console.WriteLine(Math.Min(A_Q1,B_Q2)+" "+Math.Max(A_Q1+B_Q2-N_PeopleNum,0));
    }
    }