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

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

【プログラミングコンテスト】AtCoder記事まとめ

久しぶりに今週末は予定のない終末なのでAtCoderに全力注げそうな、ねむーです。

今回はいつもと趣向を変えて、今まで作成したAtCoder問題との記事のまとめを作成しました!

空欄はまだ解いてない問題ですので、更新を気長にお待ちください(^-^;

令和AtCoderの解答記事一覧

コンテスト A問題 B問題 C問題 D問題 E問題 F問題
ABC153 A - Serval vs Monster B - Common Raccoon vs Monster C - Fennec vs Monster D - Caracal vs Monster E - Crested Ibis vs Monster
ABC152 C - Low Elements D - Handstand 2
ABC150 A - 500 Yen Coins B - Count ABC C - Count Order
ABC147 A - Blackjack B - Palindrome-philia C - Honest Or Unkind2 D - Xor Sum 4
ABC146 A - Can't Wait for Holiday B - ROT N C - Buy an Integer
ABC145 A - Circle B - Echo C - Average Length
ABC138 A - Red or Not B - Resistors in Parallel
ABC137 C - Green Bin
ABC136 D - Gathering Children
ABC135 A - Harmony
ABC133 A - T or T C - Remainder Minimization 2019 D - Rain Flows into Dams
ABC132 B - Ordinary Number C - Divide the Problems D - Blue and Red Balls
ABC129 A - Airplane B - Balance
ABC128 A - Apple Pie
ABC127 A - Ferris Wheel
ABC126 C - Dice and Coin

ABC以外のコンテスト

コンテスト A問題 B問題 C問題 D問題
三井住友信託銀行プログラミングコンテスト A - November 30 B - Tax Rate C - 100 to 105
第二回全国統一プログラミング王決定戦 A - Sum of Two Integers
diverta 2019 Programming Contest A - Consecutive Integers

平成AtCoderの解答記事一覧

コンテスト A問題 B問題 C問題 D問題
Tenka1 Programmer Beginner Contest 2019 A - On the Way B - e e *ee *e C - Stones
ABC124 A - Buttons B - Great Ocean View C - Coloring Colorfully D - Handstand
ABC123 A - Five Antennas B - Five Dishes C - Five Transportations
エクサウィザーズ2019 A - Regular Triangle B - Red or Blue
ABC122 A-Double Helix B - ATCoder C - GeT AC
早稲田大学プロコン2019 A - WAsedAC B - 10 puzzle
ABC121 C - Energy Drink Collector
ABC120 A - Favorite Sound B - K-th Common Divisor C - Unification
ABC119 A - Still TBD B - Digital Gifts C - Synthetic Kadomatsu
ABC118 A - B +/- A C - Monsters Battle Royale
ABC117 A - Entrance Examination B - Polygon C - Streamline
全国統一プログラミング王決定戦 A - Subscribers B - Touitsu C - Different Strokes
ABC116 C - Grand Garden
ABC115 C - Christmas Eve
ABC114 C - 755
ABC113 C - ID
ABC112 C - Pyramid

最後に

この記事はブログのトップに固定しておくので、復習や問題探しなどにご活用ください!

リンクミス等あれば、コメントにて指摘してもらえると助かります(^^)

AtCoder Beginner Contest 156 C - Rally

実家で生活習慣の改善をしています、ねむーです。

今回はAtCoder(https://atcoder.jp/contests/abc156/tasks/abc156_c)にて開催されました、AtCoder Beginner Contest 156 C問題「C - Rally」の問題と僕との戦闘記です。

0.はじめに

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

1.問題文

数直線上に N 人の人が住んでいます。

i 番目の人が住んでいるのは座標 X i です。

あなたは N 人全員が参加する集会を開くことを考えています。

集会は数直線上の任意の 整数値の座標 で開くことができ、座標 P で集会を開くとき、 i 番目の人は集会に参加するために ( X i − P ) 2 の体力を消費します。

N 人が消費する体力の総和としてありえる値の最小値を求めてください。

2.制約

  • 入力は全て整数である。
  • 1 ≤ N ≤ 100
  • 1 ≤ X_i ≤ 100

3.入出力例

  • 入力
7
14 14 2 13 56 2 37
  • 出力
2354

4.初見の感想

  • どのように数直線上に人間が分布しているかで大きく結果が変わる
  • 1~100までしか範囲が無いので各点での結果を全探索します

5.コードと簡単な解説

using System;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            int N=int.Parse(Console.ReadLine());
            string[] input=Console.ReadLine().Split();
            int []X=new int[N];
            for(int i=0;i<N;i++){
                X[i]=int.Parse(input[i]);
            }
            int ans=int.MaxValue;
            for(int i=0;i<100;i++){
//各点iでのループ
                int temp=0;
                for(int j=0;j<N;j++){
//距離の2乗を計算
                    temp+=(X[j]-i)*(X[j]-i);
                }
                ans=Math.Min(ans,temp);
            }
            Console.WriteLine(ans);
        }
    }
}

6.最後に

この問題が灰パフォは驚き!

AtCoder Beginner Contest 156 B - Digits

引っ越し作業などで久しぶりの更新になってしまいました、ねむーです。

今回はAtCoder(https://atcoder.jp/contests/abc156/tasks/abc156_b)にて開催されました、AtCoder Beginner Contest 156 B問題「B - Digits」の問題と僕との戦闘記です。

0.はじめに

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

1.問題文

整数 N を K 進数で表したとき、何桁になるかを求めてください。

2.制約

  • 入力は全て整数である。
  • 1 ≤ N ≤ 109
  • 2 ≤ K ≤ 10

3.入出力例

  • 入力
314159265 3
  • 出力
18

4.初見の感想

  • X桁で表せる最大数はKXで表せる
  • NとKXのどちらが大きいか判定する
  • Kをwhile文で何回も掛け合わせる

5.コードと簡単な解説

using System;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] input=Console.ReadLine().Split();
            int N=int.Parse(input[0]);
            int K=int.Parse(input[1]);
            int temp=1;
            int num=0;
            while(temp<=N){
//num桁で表せる最大数tempを計算
                temp*=K;
                num++;
            }
            Console.WriteLine(num);
        }
    }
}

6.最後に

自分のペースでがんばります…

AtCoder Beginner Contest 156 A - Beginner

花粉を感じる季節ですね、ねむーです。

今回はAtCoder(https://atcoder.jp/contests/abc156/tasks/abc156_a)にて開催されました、AtCoder Beginner Contest 156 A問題「A - Beginner」の問題と僕との戦闘記です。

0.はじめに

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

1.問題文

高橋君はプログラミングコンテストサイト「ButCoder」の会員です。

ButCoder の会員には 2 つのレーティング 内部レーティング と 表示レーティング が割り当てられています。

表示レーティングは、その会員のコンテスト参加回数が 10 以上のときは内部レーティングに等しく、そうでないときは、会員のコンテスト参加回数を K として、内部レーティングから 100 × ( 10 − K ) を引いたものになります。

高橋君のコンテスト参加回数が N で表示レーティングが R であるとき、高橋君の内部レーティングを求めてください。

2.制約

  • 入力は全て整数である
  • 1 ≤ N ≤ 100
  • 0 ≤ R ≤ 4111

    3.入出力例

  • 入力
2 2919
  • 出力
3719

4.初見の感想

  • 条件分岐をする

5.コードと簡単な解説

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

class Program
{
    public static void Main()
    {
        string[] input = Console.ReadLine().Split();
        int N = int.Parse(input[0]);
        int R = int.Parse(input[1]);
        int ans = 0;
        if (N >= 10) { ans = R; }
        else { ans = R + 100 * (10 - N); }
        Console.WriteLine(ans);
    }
}

6.最後に

ansの変数を書くことでWriteLineを2回書かずに済みます!

AtCoder Beginner Contest 154 A - Remaining Balls

もう2月も半分終わってしまいましたね、ねむーです。

今回はAtCoder(https://atcoder.jp/contests/abc154/tasks/abc154_a)にて開催されました、AtCoder Beginner Contest 154 A問題「A - Remaining Balls」の問題と僕との戦闘記です。

0.はじめに

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

1.問題文

文字列 S の書かれたボールが A 個、文字列 T の書かれたボールが B 個あります。 高橋君は、文字列 U の書かれたボールを 1 個選んで捨てました。 文字列 S , T の書かれたボールがそれぞれ何個残っているか求めてください。

2.制約

  • S , T , U は英小文字のみからなる文字列
  • S , T の長さは 1 以上 10 以下
  • S ≠ T -S= U または T= U
  • 1 ≤ A , B ≤ 10
  • A , B は整数

3.入出力例

  • 入力
red blue
3 4
red
  • 出力
2 4

4.初見の感想

  • 文字列判定して条件分岐です

5.コードと簡単な解説

コードusing System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    public static void Main()
    {
        string []input=Console.ReadLine().Split();
        string[] temp = Console.ReadLine().Split();
        int a = int.Parse(temp[0]);
        int b = int.Parse(temp[1]);
        string ans = Console.ReadLine();
        if (input[0] == ans) { Console.Write(a-1); Console.Write(" "); Console.Write(b); }
        else { Console.Write(a); Console.Write(" "); Console.Write(b-1); }
    }
}

6.最後に

意外と条件分岐が長い…

AtCoder Beginner Contest 154 B - I miss you...

バレンタインデーですね、ねむーです。

今回はAtCoder(https://atcoder.jp/contests/abc154/tasks/abc154_b)にて開催されました、AtCoder Beginner Contest 154 B問題「B - I miss you...」の問題と僕との戦闘記です。

0.はじめに

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

1.問題文

文字列 S が与えられます。 S のすべての文字を x で置き換えて出力してください。

2.制約

  • S は英小文字のみからなる文字列
  • S の長さは 1 以上 100 以下

3.入出力例

  • 入力
sardine
  • 出力
xxxxxxx

4.初見の感想

  • 文字数分xを出力しましょう

5.コードと簡単な解説

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

class Program
{
    public static void Main()
    {
        string input=Console.ReadLine();
        for(int i = 0; i < input.Length; i++)
        {
            Console.Write("x");
        }
    }
}

6.最後に

今回はA問題よりB問題が簡単という不思議…

AtCoder Beginner Contest 154 C - Distinct or Not

雪は降らないですが雨が多いですね、ねむーです。

今回はAtCoder(https://atcoder.jp/contests/abc154/tasks/abc154_c)にて開催されました、AtCoder Beginner Contest 154 C問題「C - Distinct or Not」の問題と僕との戦闘記です。

0.はじめに

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

1.問題文

整数列 A 1 , A 2 , . . . , A N が与えられます。 この整数列のどの 2 つの要素も互いに異なるならば YES を、そうでないなら NO を出力してください

2.制約

  • 2 ≤ N ≤ 200000
  • 1 ≤ A i ≤ 109
  • 入力は全て整数

3.入出力例

  • 入力
6
4 1 3 1 6 2
  • 出力
NO

4.初見の感想

  • 同じ数字が前に出ているかをfor文ループ処理すれば求められる
  • この手法はTLE

5.学びポイント

  • Sortして連続する2つの数を同じか判定

6.コードと簡単な解説

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

class Program
{
    public static void Main()
    {
        int N = int.Parse(Console.ReadLine());
        string []input=Console.ReadLine().Split();
        int []A = new int[N];
        string flag = "YES";
        for (int i = 0; i < N; i++)
        {
            A[i] = int.Parse(input[i]);
        }
        //ソート
        Array.Sort(A);
        for (int i = 1; i < N; i++)
        {
            //連続する2数が同じか判定
            if (A[i] == A[i - 1]) { flag = "NO"; }
        }
        Console.WriteLine(flag);
    }
}

7.最後に

制約条件見落としがちですね~

AtCoder Beginner Contest 154 D - Dice in Line

無事修論を出しまして一段落、ねむーです。

今回はAtCoder(https://atcoder.jp/contests/abc154/tasks/abc154_d)にて開催されました、AtCoder Beginner Contest 154 D問題「D - Dice in Line」の問題と僕との戦闘記です。

0.はじめに

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

1.問題文

N 個のサイコロが左から右に一列に並べてあります。左から i 番目のサイコロは 1 から p i までの p i 種類の目がそれぞれ等確率で出ます。

隣接する K 個のサイコロを選んでそれぞれ独立に振ったとき、出る目の合計の期待値の最大値を求めてください。

2.制約

  • 1 ≤ K ≤ N ≤ 200000
  • 1 ≤ p i ≤ 1000
  • 入力で与えられる値は全て整数

3.入出力例

  • 入力
5 3
1 2 2 4 5
  • 出力
7.000000000000

4.初見の感想

  • それぞれのサイコロの期待値は独立に求められる
  • 計算量O(N)で解きたい

5.学びポイント

  • 期待値和がK個になるまで期待値を前から足し合わせる
  • K個を超えたら最初の期待値を減じて、新しい数字を足し合わせる
  • 上の処理で連続するK個の期待値和を計算できる

6.コードと簡単な解説

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

class Program
{
    public static void Main()
    {
        string []input=Console.ReadLine().Split();
        int N = int.Parse(input[0]);
        int K = int.Parse(input[1]);
        input = Console.ReadLine().Split();
        int[] p = new int[N];
        double[] avg = new double[N];
        double max = 0;
        double temp = 0;
        for(int i=0; i < N; i++)
        {
            p[i] = int.Parse(input[i]);
            //期待値計算
            avg[i] = (p[i] - 1) * 0.5 + 1;
            if (i >= K) {
                //順に連続期待値和を計算
                temp = temp + avg[i] - avg[i - (K)];
            }
            else
            {
                temp += avg[i];
            }
            if (temp > max) { max = temp; }
        }
        Console.WriteLine(max);
    }
}

7.最後に

最初にKを見逃してて一回WAしました…