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

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

AtCoder Beginner Contes 152 A - AC or WA

今年は雪が降らないので少しさみしいです、ねむーです。

今回はAtCoder(https://atcoder.jp/contests/abc152/tasks/abc152_a)にて開催されました、AtCoder Beginner Contes 152 A問題「A - AC or WA」の問題と僕との戦闘記です。

0.はじめに

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

1.問題文

高橋君は、プログラミングコンテスト AXC001 に参加しており、問題 A にコードを提出しました。 この問題には N 個のテストケースがあり、すべてのテストケースに正解した場合のみ提出は AC となります。 高橋君の提出は、 N 個のテストケースのうち M 個のテストケースに正解しました。 高橋君の提出が AC となるか判定してください。

2.制約

  • 1 ≤ N ≤ 100
  • 0 ≤ M ≤ N
  • 入力はすべて整数である。

3.入出力例

  • 入力
3 3
  • 出力
Yes

4.初見の感想

  • NとMが一致しているかを判定します

    5.コードと簡単な解説

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main(string[] args)
    {
        string[] input = Console.ReadLine().Split();
        int N = int.Parse(input[0]);
        int M = int.Parse(input[1]);
        if (N == M) { Console.WriteLine("Yes"); }
        else Console.WriteLine("No");
    }
}

7.最後に

問題文の解釈勝負ですね~

AtCoder Beginner Contest 152 B - Comparing Strings

最近紅茶がブームになっています、ねむーです。

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

0.はじめに

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

1.問題文

1 桁の正整数 a , b が与えられます。整数 a を b 回繰り返してできる文字列と 整数 b を a 回繰り返してできる文字列のうち、辞書順で小さい方を答えてください。

2.制約

  • 1 ≤ a ≤ 9
  • 1 ≤ b ≤ 9
  • a , b は整数

3.入出力例

  • 入力
4 3
  • 出力
3333

4.初見の感想

  • 先頭の数字が小さい方が、辞書順は早い
  • 2つの数字の小さい方で数字を作る

5.学びポイント

  • 改行しない文字表示はConsole.Writeでできる

6.コードと簡単な解説

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main(string[] args)
    {
        string[] input = Console.ReadLine().Split();
        int a = int.Parse(input[0]);
        int b = int.Parse(input[1]);
        if (a < b) { for (int i = 0; i < b; i++) { Console.Write(a); } }
        else { for (int i = 0; i < a; i++) { Console.Write(b); } }
    }
}

7.最後に

久しぶりにConsole.Write使いましたね!

AtCoder Beginner Contest 153 C - Fennec vs Monster

久しぶりに晴れている気がします、ねむーです。

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

0.はじめに

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

1.問題文

フェネックは N 体のモンスターと戦っています。

i 番目のモンスターの体力は H i です。

フェネックは次の 2 種類の行動を行うことができます。

  • 攻撃:モンスターを 1 体選んで攻撃することで、そのモンスターの体力を 1 減らす
  • 必殺技:モンスターを 1 体選んで必殺技を使うことで、そのモンスターの体力を 0 にする

攻撃と必殺技以外の方法でモンスターの体力を減らすことはできません。

全てのモンスターの体力を 0 以下にすればフェネックの勝ちです。

フェネックが K 回まで必殺技を使えるとき、モンスターに勝つまでに行う攻撃の回数 (必殺技は数えません) の最小値を求めてください。

2.制約

  • 1 ≤ N ≤ 2 × 105
  • 0 ≤ K ≤ 2 × 105
  • 1 ≤ H i ≤ 109
  • 入力中のすべての値は整数である

3.入出力例

  • 入力
3 0
1000000000 1000000000 1000000000
  • 出力
3000000000

4.初見の感想

  • HPの大きい敵に必殺技を使いたい
  • HPの昇順にソートして、HPの和をK番目から考える
  • オーバーフローに注意してlong型を使用

5.コードと簡単な解説

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    public static void Main()
    {
        string[] input = Console.ReadLine().Split();
        long N = long.Parse(input[0]);
        long K = long.Parse(input[1]);
        long[] H = new long[N];
        input = Console.ReadLine().Split();
        for (long i = 0; i < N; i++)
        {
            H[i] = long.Parse(input[i]);
        }
        Array.Sort(H);
        Array.Reverse(H);
        long ans = 0;
        for(long i = K; i < N; i++)
        {
            ans += H[i];
        }
        Console.WriteLine(ans);
    }
}

6.最後に

実はブログ投稿ツイートのいいねに喜んでいます!

AtCoder Beginner Contest 153 A - Serval vs Monster

修論をがんばる2月です、ねむーです。

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

0.はじめに

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

1.問題文

サーバルはモンスターと戦っています。

モンスターの体力は H です。

サーバルが攻撃を 1 回行うとモンスターの体力を A 減らすことができます。 攻撃以外の方法でモンスターの体力を減らすことはできません。

モンスターの体力を 0 以下にすればサーバルの勝ちです。

サーバルがモンスターに勝つために必要な攻撃の回数を求めてください。

2.制約

  • 1 ≤ H ≤ 104
  • 1 ≤ A ≤ 104
  • 入力中のすべての値は整数である。

3.入出力例

  • 入力
10 4
  • 出力
3

4.初見の感想

  • H÷Aの小数点切り上げです

    5.学びポイント

  • Math.Ceilingで切り上げできます

    6.コードと簡単な解説

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    public static void Main()
    {
        string[] input = Console.ReadLine().Split();
        double H = double.Parse(input[0]);
        double A = double.Parse(input[1]);
        double ans = 0;
        ans = Math.Ceiling(H / A);
        Console.WriteLine(ans);
    }
}

7.最後に

ぱっと切り上げの関数名出てこないんですよね(^-^;

AtCoder Beginner Contest 150 C - Count Order

1月も終わるのが早いです、ねむーです。

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

0.はじめに

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

1.問題文

大きさ N の順列 ( 1 , 2 , . . . , N ) を並び替えてできる数列) P , Q があります。

大きさ N の順列は N ! 通り考えられます。このうち、 P が辞書順で a 番目に小さく、 Q が辞書順で b 番目に小さいとして、 | a − b | を求めてください。

2.制約

  • 2 ≤ N ≤ 8
  • P , Q は大きさ N の順列である。
  • 入力は全て整数である。

3.入力例

  • 入力
8
7 3 5 4 2 1 6 8
3 8 2 5 4 6 7 1
  • 出力
17517

4.初見の感想

  • 制約が2~8なので入力として考えられるパターンを全部列挙して、何番目かを確かめたい
  • どうやって辞書順に並べ替えるか

5.学びポイント

  • 順列を辞書順で作成するPermutationクラスを作った
  • 再帰的処理で順列を作成
  • 先頭で「1」を使う→「2,3,4」で残りの順列を作るという感じ

    6.コードと簡単な解説

using System;
using System.Collections.Generic;
using System.Linq;
public class Permutation
{
    //再帰の初期セットを代入する処理
    public IEnumerable<T[]> Enumerate<T>(IEnumerable<T> items)
    {
        return _GetPermutations<T>(new List<T>(), items.ToList());
    }
    //再帰関数
    private IEnumerable<T[]> _GetPermutations<T>(IEnumerable<T> perm, IEnumerable<T> items)
    {
        if (items.Count() == 0)
        {
            yield return perm.ToArray();
        }
        else
        {
            foreach (var item in items)
            {
                //先頭の文字を省いて再帰を回す
                var result = _GetPermutations<T>(perm.Concat(new T[] { item }), items.Where(x => x.Equals(item) == false));
                foreach (var xs in result)
                    yield return xs.ToArray();
            }
        }
    }
}

class Program
{
    public static void Main()
    {
        int N = int.Parse(Console.ReadLine());
        string[] input = Console.ReadLine().Split();
        string[] input2 = Console.ReadLine().Split();
        int[] A = new int[N];
        int[] B = new int[N];
        int[] temp = new int[N];
        int pattern = 1;
        for (var i = 0; i < N; i++)
        {
            A[i] = int.Parse(input[i]);
            B[i] = int.Parse(input2[i]);
            //patternで順列の総数を計算
            pattern *= (i + 1);
            //最初に入力する1~Nまでの順列を準備
            temp[i] = i+1;
        }
        int[,] all_list = new int[pattern, N];
        var perm = new Permutation();
        int count = 0,a_num=0,b_num=0;
        bool A_flag = true;
        bool B_flag = true;
        foreach (var n in perm.Enumerate(temp))
        {
            A_flag = true;B_flag = true;
            for (int i = 0; i < N; i++)
            {
                //辞書順でAやBと一致しないところがあればflagをfalse
                all_list[count, i] = n[i];
                if (A[i] != n[i]) A_flag = false;
                if (B[i] != n[i]) B_flag = false;
            }
            count++;
            //辞書順をa_num,b_numに保存
            if (A_flag == true) { a_num = count; }
            if (B_flag == true) { b_num = count; }
        }
        Console.WriteLine(Math.Abs(a_num - b_num));
    }
}

7.最後に

この問題みんな通してるんだけど、僕は苦手な気がします…

AtCoder Beginner Contest 150 B - Count ABC

緑色になってから毎回コンテストに緊張します、ねむーです。

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

0.はじめに

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

1.問題文

英大文字のみからなる長さ N の文字列 S があります。

S の連続する部分列 (入出力例をご覧ください) として ABC がいくつ含まれるかを求めてください。

2.制約

  • 3 ≤ N ≤ 50
  • S は英大文字のみからなる。

3.入力例

  • 入力
33
ABCCABCBABCCABACBCBBABCBCBCBCABCB
  • 出力
5

4.初見の感想

  • string型は配列形式で要素にアクセスできる(input[i]の形)
  • for文でABCを検出

5.コードと簡単な解説

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();
        int ans = 0;
        for(int i = 0; i < N - 2; i++)
        {
            if (input[i] == 'A' && input[i+1] == 'B' && input[i+2] == 'C') ans++;
        }
        Console.WriteLine(ans);
    }
}

6.最後に

最近のB問題は灰色パフォーマンスなのは驚きです…

AtCoder Beginner Contest 153 B - Common Raccoon vs Monster

最近のABCではこの辺の問題は早解き選手権ですね、ねむーです。

今回はAtCoder(https://atcoder.jp/contests/abc153/tasks/abc153_b)にて開催されました、AtCoder Beginner Contest 153 B問題「B - Common Raccoon vs Monster」の問題と僕との戦闘記です。

0.はじめに

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

1.問題文

アライグマはモンスターと戦っています。

モンスターの体力は H です。

アライグマは N 種類の必殺技を使うことができ、 i 番目の必殺技を使うとモンスターの体力を A i 減らすことができます。 必殺技を使う以外の方法でモンスターの体力を減らすことはできません。

モンスターの体力を 0 以下にすればアライグマの勝ちです。

アライグマが同じ必殺技を 2 度以上使うことなくモンスターに勝つことができるなら Yes を、できないなら No を出力してください。

2.制約

  • 1 ≤ H ≤ 109
  • 1 ≤ N ≤ 105
  • 1 ≤ A i ≤ 104
  • 入力中のすべての値は整数である。

3.入出力例

  • 入力
211 5
31 41 59 26 53
  • 出力
No

4.初見の感想

  • 配列Aの和がHを超えているかどうかで条件分岐です

    5.学びポイント

  • C#では.sum()で和が計算できます

    6.コードと簡単な解説

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    public static void Main()
    {
        string[] input = Console.ReadLine().Split();
        long H = int.Parse(input[0]);
        long N = int.Parse(input[1]);
        input = Console.ReadLine().Split();
        long[]A = new long[N]; 
        for(long i = 0; i < N; i++)
        {
            A[i] = int.Parse(input[i]);
        }
        long sum = A.Sum();
        if (H <= sum) { Console.WriteLine("Yes"); }
        else { Console.WriteLine("No"); }
    }
}

7.最後に

少し問題解釈に時間かかりましたので反省です…