ABC161

久しぶりの投稿。

営業からエンジニアに異動ができ、C#を使うことになったので、これからはC#でやっていきます!

まだ、初C#でゆっくりA問題からやっていったらだいぶ時間がかかったので、ざっくり書いていきます。

画像1

using System;

class Program{
 public static void Main(){

   var input = Console.ReadLine().Split(' ');
   System.Console.WriteLine(input[2] + " " + input[0] + " " + input[1]);
 }
}

慣れない形式でエラーばかりになるが、とりあえずクリア。

続いてB問題。

画像2

Aiの和を求めて、得票数の条件を満たしている商品数がM以上あればOK!

using System;

class Program{
 public static void Main(){

   var input = Console.ReadLine().Split();
   int n = int.Parse(input[0]);
   int m = int.Parse(input[1]);
   
   input = Console.ReadLine().Split();
   int[] a = new int[n];
   
   int sum_a = 0;
   for(int i=0; i<n; i++){
     a[i] = int.Parse(input[i]);
     sum_a += a[i];
   }
   
   int cnt = 0;
   for(int i=0; i<n; i++){
     if(a[i] > sum_a /(4*m)) cnt++;
     else if(a[i] == sum_a /(4*m)){
       if(sum_a % (4*m) == 0) cnt++;
     }
   }
   
   if(cnt >= m) Console.WriteLine("Yes");
   else Console.WriteLine("No");
   
   
 }
}

A問題でも思ったけどC++に比べて入力がちょっとめんどい。文字列での入力になるから、自分で空白で区切らないといけないし、型も変換しないといけないっぽい。配列の宣言方法、変数の後じゃなくて型の後なんだ。

和を求めるのはループ回さなくても用意されているらしい。得票数の条件のところは整数型で分けたけど、小数使ってもよかったかも。

C問題。

画像4

NからKを引いていった余りと、その余りからもう一回Kを引いたものが、どちらが小さくなるかを見ていく。

using System;

class Program{
 public static void Main(){
   
   var input = Console.ReadLine().Split();
   long n = long.Parse(input[0]);
   long k = long.Parse(input[1]);
   
   long m = n % k;
   long ans = Math.Min(m,Math.Abs(m-k));
   
   Console.WriteLine(ans);
 }
}

プロパティってやつが慣れない。いちいち大文字だけど慣れると呼び出しやすいのかも。

D問題。

画像4

これは解けなかったー。全検索すると間に合わないし、おおよその桁数くらいまでは出せたけど、そこからどうしていいかがわからん。

解説見たらめちゃくちゃわかりやすくて感動した。解説を見て実装したのがこちら。

using System;
using System.Collections.Generic;

class Program{
 public static void Main(){
   
   int k = int.Parse(Console.ReadLine());
   
   var que = new Queue<long>();
   for(int i=1; i<=9; i++){
     que.Enqueue(i);
   }
   
   long dq = 0;
   for(int i=0; i<k; i++){
     dq = que.Dequeue();
     
     if(dq%10 != 0){
       que.Enqueue(10*dq +(dq%10) -1);
     }
     que.Enqueue(10*dq +(dq%10));
     
     if(dq%10 != 9){
       que.Enqueue(10*dq +(dq%10) +1);
     }
   }
 
   Console.WriteLine(dq);
 }
}

キューを使って、取り出した数字に一桁加えてキューに戻す。0と9だけ桁が変わるから、それだけ省いてK番目に取り出したものが回答!

配列の末尾に入れていく形式でもよかったけど、わかりづらくなりそうなので止めました。キューはあんまり使い慣れてないのでBFS含めて要練習。using Systemだけだとキューは使えないみたいなので、そこらへんももう少し調べる。

Eも解きたかったけどだいぶ時間がかかったのでここまで。