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

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

ABC144で書いたコード(C#)

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

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

            
            if(a <= 9 && b <= 9) //aとbの両方が9以下なら計算できるので計算する
                Console.WriteLine(a * b);
            else //それ以外は計算できないので-1を出力
                Console.WriteLine("-1");
                
        }
    }

    class ProgramB
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine();
            int n = int.Parse(input);

            //九九表を作る準備
            int[,] kuku = new int[9,9];
            int frag = 0;
            
            //九九表を作成する
            for(int i = 0;i < 9 ;i++)
                for(int j = 0;j < 9 ;j++)
                kuku[i,j= (i+1* (j+1);

            //九九表の中で一致するものがあればfrag = 1(Yes)、なければfrag = 0(No)
            for(int i = 0;i < 9 ;i++)
                for(int j = 0;j < 9 ;j++)
            {
                if(kuku[i,j== n)
                {
                    frag = 1;
                    break;
                }
            }

            //答え出力
            if(frag == 1)
                Console.WriteLine("Yes");
            else
                Console.WriteLine("No");
                
        }
    }

    class ProgramC
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine();
            ulong n = int.Parse(input);

            //ありえないほど大きい数を答えに入れておく
            ulong ans = 1000000000000;

            //sqrt(n)までで割ってみて割れるならその時の移動数を求める。
            for(ulong i = 1i <= Math.sqrt(n);i++)
            {
                if(n % i == 0)
                {
                    ulong a = n / i;
                    ulong count = a + i - 2; //移動数
                    if(count < ans)
                        ans = count; //移動が小さいなら更新
                }
                    
                
            }

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

    class ProgramD
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine().Split();
            double a = double.Parse(input[0]);
            double b = double.Parse(input[1]);
            double x = double.Parse(input[2]);

            double ans = 0;

            //水の量が1/2より大きいかどうかで場合分けをする
            if(x > a*a*b/2.0)
            {
                double c = 2.0 * x /a/a - b;
                double cos = a/Math.Sqrt(a*a + (b-c)*(b-c)); //水が1/2より大きいときのcosの値
                ans = 180.0/Math.PI * Math.Acos(cos);
            }
            else
            {
                double d = 2.0 * x /a/b;
                double sin = d / Math.Sqrt(d*d + b*b); //水が1/2以下のときのcosの値
                ans = 180.0/Math.PI * Math.Acos(cos);

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

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

            //配列準備
            long eat = new long[n];
            long food = new long[n];
            long sec = new long[n];

            //消費コストを配列格納
            string input_a = Console.ReadLine().Split();
            for(int i = 0i < ni++)
                eat[i= long.Parse(input_a[i]);
            
            //食べにくさを配列格納
            string[] input_f = Console.ReadLine().Split();
            for(int i = 0i < ni++)
                food[i= long.Parse(input_f[i]);
            
            long check = 0;

            //修行で減らせる最大回数を計算
            for(int i = 0i < ni++)
                check += eat[i];
            
            //もし最大以上なら食べる時間を0にできるので0とする
            ifk >= check)
            {
                Console.WriteLine("0");
                return; //ここでおわり
            }

            //食べる力を昇順、食べにくさを降順にする
            Array.Sort(eat);
            Array.Sort(food);
            Array.Reverse(food);

            //それぞれの人が食べる時間を出す。
            for(int i = 0i < ni++)
                sec[i= food[i* eat[i];

            
            //一番かかる場合を出す。最小は0とする
            long max = sec.Max();
            long min = 0;
            
            //二分探索法。考え方はすべての人がx秒以内に食べられるかを検討し、できるならその秒数を最大にする。
            //できないならその秒数よりは大きくなるので最小にする。最終的に秒数の差が1秒以内に収まるはずなのでその時の最大を出力
            while(max != min + 1)
            {
                //とりあえず真ん中の数でそれより大きいか小さいかを探す
                long x =(max + min/2;
                long count = 0;

                for (int i = 0i < ni++)
                {
                    //減らさないとならなない秒数を計算。それに応じてカウントする
                    if (sec[i> x)
                    {
                        if((sec[i- x)%food[i== 0)
                            count += (sec[i- x)/food[i];
                        else
                            count += (sec[i- x)/food[i+ 1;
                    }
                }

                //可能なら最大秒に、不可能なら最小秒にする
                if(count < k)
                    max = x;
                else
                    min = x;

            }

            //結果出力
            Console.WriteLine(max);    
        }

        
    }
    

            
}