競プロをしながら、節約と株式投資でセミリタイアを目指す東大卒のブログ

東大卒でメーカー勤務の私がセミリタイアするために投資や競プロを頑張っていこうという趣旨で始めたブログです。独身男性です。火木土日に更新予定です。お金について考えています。

ABC153で書いたコード

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

namespace Atcoder20190616
{
    class ProgramA
    {
        static void Main(string args)
        {
            //入力
            string input = Console.ReadLine().Split(' ');
            int h = int.Parse(input[0]);
            int a = int.Parse(input[1]);

            //h/aであまりが生じないならそのまま、それ以外は1回足す
            
                if(h % a == 0)
                    Console.WriteLine(h / a);
                else
                    Console.WriteLine(h / a + 1);
            
            
        }
    }

    class ProgramB
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine().Split(' ');
            int h = int.Parse(input[0]);
            int n = int.Parse(input[1]);

            int sum = 0;
            string input2 = Console.ReadLine().Split(' ');

            //すべての和を求める
            for(int i = 0;i < n;i++)
                sum += int.Parse(input2[i]);
            
            
            //すべての和が合計を超えたら倒せる。それ以外は倒せない。
            if(sum >= h)
                Console.WriteLine("Yes");
            else
                Console.WriteLine("No");
    
        }
    }

    class ProgramC
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine().Split(' ');
            int n = int.Parse(input[0]);
            int k = int.Parse(input[1]);
            long a = new long[n];

            int sum = 0;

            
            string input2 = Console.ReadLine().Split(' ');
            for(int i = 0;i < n;i++)
                a[i] = long.Parse(input2[i]);

            //小さい順にソートする
            Array.Sort(a);


            //小さい順に足していけばコストが少ない。k回引いた数だけ足す。
            for(int i = 0;i < n - k;i++)
                sum += a[i];

            //答え出力
            Console.WriteLine(sum);
        } 
    }   

    class ProgramD
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine();
            long h = long.Parse(input);
            int count = 0;
            long sum = 1;
            
            //2の割れる回数を求める
            while(h != 1)
            {
                h /= 2;
                count++;
            }


            //漸化式で攻撃する回数を求める
            for(int i = 0;i < count;i++)
                sum = sum * 2 + 1;


            //答え出力
            Console.WriteLine(sum);
        } 
    } 

    class ProgramE
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine().Split(' ');
            int h = int.Parse(input[0]);
            int n = int.Parse(input[1]);
            int INF = 100000000; //とりあえず大きな数を入れておくためのやつ
            long sum = 1;
            
            int a = new int[n];
            int b = new int[n];
            int dp = new int[h + 10000];


            //値を代入する
            for(int i = 0;i < n;i++)
            {
                string input2 = Console.ReadLine().Split(' ');
                a[i] = int.Parse(input2[0]);
                b[i] = int.Parse(input2[1]);
            }

            //とりあえず大きな数を入れる
            for(int i = 0;i <= h;i++)
                dp[i] = INF;

            int  res = h;

            //それぞれのHPで倒すために、必要な最低コストで動的計画法
            for(int i = 0i <= h;i++)
            {
                for(int j = 0;j < n;j++)
                {
                    if(i > a[j])//HPがその攻撃より小さいとき
                        dp[i] = Math.Min(dp[i],dp[i-a[j]]+b[j]);//その攻撃を加えるかどうかで動的計画
                    else//HPは一撃で倒せる場合
                        dp[i] = Math.Min(dp[i],b[j]);//その攻撃の中での最小コストを出す
                }

            }
            
            //答を出力
            Console.WriteLine(dp[h]);
            
            
        } 
    }
    
}