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

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

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

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

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

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

AtCoderの解答記事一覧

コンテスト A問題 B問題 C問題 D問題
ABC132 C - Divide the Problems D - Blue and Red Balls
diverta 2019 Programming Contest A - Consecutive Integers
ABC128 A - Apple Pie
ABC127 A - Ferris Wheel
ABC126 C - Dice and Coin
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 138 B - Resistors in Parallel

今日も更新です、ねむーです。

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

0.はじめに

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

1.問題文

N 個の整数の列 A_1 , … , A_N が与えられます。

これらの逆数の総和の逆数 1/(1/A_1+…+1/A_N) を求めてください。

2.制約

  • 1 ≤ N ≤ 100
  • 1 ≤ A i ≤ 1000

3.入力例

  • 入力
2
10 30
  • 出力
7.5

4.初見の感想

  • 割り算を行うのでdouble型が必要

5.コードと簡単な解説

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

class Program
{
    static void Main(string[] args)
    {
        int N = int.Parse(Console.ReadLine());
        double[] A = new double[N];
        var input = Console.ReadLine().Split();
        double sum = 0;
        for(int i=0; i < N; i++)
        {
            A[i] = double.Parse(input[i]);
            sum += 1 / A[i];
        }
        Console.WriteLine(1 / sum);
    }
}

6.最後に

今回は簡単なB問題だった気がする?

AtCoder Beginner Contest 138 A - Red or Not

週末になるのは早いですね、ねむーです。

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

0.はじめに

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

1.問題文

整数 a と、英小文字からなる文字列 s が入力されます。

a が 3200 以上なら s と出力し、 a が 3200 未満なら red と出力するプログラムを書いてください。

2.制約

  • 2800 ≤ a < 5000
  • s は長さ 1 以上 10 以下の文字列である。
  • s の各文字は英小文字である。

3.入力例

  • 入力
3200
pink
  • 出力
pink

4.初見の感想

  • 単純なif文で良さそうです。

5.コードと簡単な解説

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

class Program
{
    static void Main(string[] args)
    {
        int a = int.Parse(Console.ReadLine());
        string s = Console.ReadLine();
        if (a >= 3200) { Console.WriteLine(s); }
        else { Console.WriteLine("red"); }
    }
}

6.最後に

もう8月も終わりですね…

AtCoder Beginner Contest 135 A - Harmony

夏の終わりは雨が多いですね、ねむーです。

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

0.はじめに

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

1.問題文

相違なる整数 A , B があります。

| A − K |= | B − K | となるような整数 K を出力してください。

そのような整数が存在しなければ、代わりに IMPOSSIBLE を出力してください。

2.制約

  • 入力は全て整数である。
  • 0 ≤ A , B ≤ 109
  • A と B は相違なる。

3.入力例

  • 入力
998244353 99824435
  • 出力
549034394

4.初見の感想

  • A-KとB-Kが等しいということは?

→A+B=2KとなるKを求める

  • Kが存在するかどうかの判定

→A+Bが2で割り切れるかどうか

5.コードと簡単な解説

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

class Program
{
    static void Main(string[] args)
    {
        var input = Console.ReadLine().Split();
        long A = long.Parse(input[0]);
        long B = long.Parse(input[1]);
        if ((A + B) % 2 == 1) { Console.WriteLine("IMPOSSIBLE"); }
        else { Console.WriteLine((A + B) / 2); }
    }
}

6.最後に

初めて予約投稿を使ってみました!

AtCoder Beginner Contest 137 C - Green Bin

久しぶりの更新、ねむーです。

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

0.はじめに

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

1.問題文

文字列 a に含まれる文字を何らかの順序で並べることで得られる文字列を a の アナグラム と呼びます。

例えば、greenbin は beginner のアナグラムです。このように、同じ文字が複数回現れるときはその文字をちょうどその回数だけ使わなければなりません。

N 個の文字列 s_1 , s_2 , … , s_N が与えられます。それぞれの文字列は長さが 10 で英小文字からなり、またこれらの文字列はすべて異なります。

二つの整数 i , j ( 1 ≤ i < j ≤ N ) の組であって、 s_i が s_j のアナグラムであるようなものの個数を求めてください。

2.制約

  • 2 ≤ N ≤ 105
  • s_i は長さ 10 の文字列である。
  • s_i の各文字は英小文字である。
  • s_1 , s_2 , … , s_N はすべて異なる。

3.入力例

  • 入力
5
abaaaaaaaa
oneplustwo
aaaaaaaaba
twoplusone
aaaabaaaaa
  • 出力
4

4.初見の感想

→1文字ずつに分解し、ソートをして一致するかを調べる

5.学びポイント

  • 一致した回数をどう保存するか

→Dictionary型で保存

6.コードと簡単な解説

using System;
using System.Collections.Generic;
 
public class Program{
    public static void Main(){
        int N=int.Parse(Console.ReadLine());
        long ans=0;
        var dict = new Dictionary<string, int>();
        for(int i=0;i<N;i++){
//入力を一文字ずつに分解しソート
            char[] a=Console.ReadLine().ToCharArray();
            Array.Sort(a);
            string s=new String(a);
//Dictionary型で一致するものがあるかを確認
            if(dict.ContainsKey(s)){
                ans+=dict[s];
                dict[s]++;
            }else{
                dict.Add(s,1);
            }
        }
//出力
        Console.WriteLine(ans);
    }
}

7.最後に

なかなかレートが伸び悩んでいます…

AtCoder Beginner Contest 136 D - Gathering Children

朝からオープンキャンパスバイトで眠さMAX、ねむーです。

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

0.はじめに

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

1.問題文

マスの情報を表す、L と R で構成された文字列 S が与えられます。

文字列 S の長さを N としたとき、 N 個のマスが左右一列に並んでおり、左から i 番目のマスには S の左から i 番目の文字が書かれています。

ただし、左端のマスには必ず R、右端のマスには必ず L が書かれています。

はじめ、各マスには 1 人の子どもが居ます。

子どもたちはそれぞれ次の規則に従った移動を 10100 回行います。

  • 今居るマスに書かれた文字に従って 1 マス移動する。すなわち、今居るマスに書かれた文字が L のとき左隣のマスに、R のとき右隣のマスに移動する。

10100 回の移動の後に各マスに居る子どもの人数を求めてください。

2.制約

  • S は長さ 2 以上 105 以下の文字列であり、 S の各文字は L または R である。
  • S の 1 文字目は R、 N 文字目は L である。

3.入力例

  • 入力
RRRLLRLLRRRLLLLL
  • 出力
0 0 3 2 0 2 1 0 0 0 4 4 0 0 0 0

4.初見の感想

  • 10100回計算するのは無謀すぎる
  • 部分列が「RL」の部分に子供の数字が集中する
  • 部分列「RL」の左にRがいくつあるか、及び「RL」の右にLがいくつあるかがわかればよい

5.学びポイント

  • for文でマスを左から1回ループして最初「R」のマスから出発して最終的に「RL」に移動する人数を数える
  • for文でマスを右から1回ループして最初「L」のマスから出発して最終的に「RL」に移動する人数を数える

6.コードと簡単な解説

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

class Program
{
    static void Main(string[] args)
    {
        string S = Console.ReadLine();
        int[] ans= new int[S.Length];
        int right=0, left = 0;
   //左からループ
        for(int i = 0; i < S.Length-1; i++)
        {
   //人数カウント
            if (S[i] == 'R' && S[i + 1] == 'R') { ans[i] = 0;right++; }
   //Rで流れてきた分+RLマスにもともといた人1人分
            if(S[i] == 'R' && S[i + 1] == 'L') {
                ans[i] = right / 2+1;
                ans[i + 1] = right / 2 + right%2+1;
                right = 0;
            }
        }

        for (int i = S.Length-1; i >0 ; i--)
        {
            if (S[i-1] == 'L' && S[i] == 'L') { ans[i] += 0; left++; }
   //Lで流れてきた分+RLマスにもともといた人1人分
            if (S[i-1] == 'R' && S[i] == 'L')
            {
                ans[i-1] += left / 2 + left % 2;
                ans[i] += left / 2;
                left = 0;
            } 
        }
        Console.WriteLine(string.Join(" ", ans));
    }
}

7.最後に

初めての水パフォでした!

嬉しいですね~

AtCoder Beginner Contest 133 A - T or T

今日もTOEICで撃沈してきました、ねむーです。

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

0.はじめに

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

1.問題文

私たちは N 人で旅行しようとしており、その交通手段として電車とタクシーがあります。

電車を使うと 1 人あたり A 円かかります。

タクシーを使うと N 人で B 円かかります。

全員の交通費の合計は最小でいくらになるでしょうか。

2.制約

  • 入力は全て整数である。
  • 1 ≤ N ≤ 20
  • 1 ≤ A ≤ 50
  • 1 ≤ B ≤ 50

3.入力例

  • 入力
4 2 9
  • 出力
8

4.初見の感想

  • A*NとBの小さい方が答えになります

5.学びポイント

  • if文などを使わずに、Min関数を使うと一行で書けてミスが減ります!

6.コードと簡単な解説

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

class Program
{
    static void Main(string[] args)
    {
        var input = Console.ReadLine().Split();
        int N = int.Parse(input[0]);
        int A = int.Parse(input[1]);
        int B = int.Parse(input[2]);
        Console.WriteLine(Math.Min(A*N, B));
    }
}

7.最後に

最近TOEICモチベが高いですが、ブログも細々とやっていきます(^-^;

AtCoder Beginner Contest 129 B - Balance

最近冷やしうどん中心の食生活です、ねむーです。

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

0.はじめに

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

1.問題文

1 から N の番号がついた N 個の重りがあり、番号 i の重りの重さは W i です。

ある整数 1 ≤ T < N に対してこれらの重りを、番号が T 以下の重り と 番号が T より大きい重りの 2 グループに分けることを考え、それぞれのグループの重さの和を S 1 , S 2 とします。

このような分け方全てを考えた時、 S 1 と S 2 の差の絶対値の最小値を求めてください。

2.制約

  • 2 ≤ N ≤ 100
  • 1 ≤ W i ≤ 100
  • 入力は全て整数である

3.入力例

  • 入力
8
27 23 76 2 3 5 62 52
  • 出力
2

4.初見の感想

  • できれば二重ループは回したくない

5.学びポイント

  • 数字列を2つに分ける

→数列の先頭を左側に分類or数列の末尾を右側に分類

→上の操作をN回繰り返せばよい

  • 判定条件は左側と右側のどちらが大きいか

6.コードと簡単な解説

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

class Program
{
    static void Main(string[] args)
    {
        int N = int.Parse(Console.ReadLine());
        string[] input = Console.ReadLine().Split(' ');
        int[] W = new int[N];
        for(int i = 0; i < N; i++)
        {
            W[i] = int.Parse(input[i]);
        }
        int left = 0;
        int right = 0;
        int l = 0;
        int r = N - 1;
        for (int i = 0; i < N; i++)
        {
            if (left <= right) { left += W[l];l++; }
            else { right += W[r]; r--; }
        }
        Console.WriteLine(Math.Abs(left-right));
    }
}

7.最後に

12分ほどで解けたので満足です!