C#入門(第7回)


前回振り返り

 インクリメント演算

前置インクリメント(Prefix increment)

x変数に対し、インクリメントした(1を加えた)の結果をyに代入する

y = ++x;

この処理は以下のコードと同じ結果となる

y = x + 1;

後置インクリメント(Postfix increment)

x変数に対し、インクリメントする(1を加える)の結果をyに代入する

y = x++;

この処理は以下のコードと同じ結果となる

y = x;
x = x + 1;

実行結果 y には xの元の値が先に代入されることになるため、変数等に代入する際の後置インクリメントは注意が必要

前回演習問題の解答 例

問題1

問題文

コアさんは格闘ゲームにハマっています。このゲームでは 1,2,3 の番号が付いた 3 種類の技を出すことができ、技 i (1≤i≤3) を1 回出すと敵に Ai​ ダメージを与えられます。ただし、A1​≤A2​≤A3​ とします。

また、これらを技 1→2→3 の順に 1 回ずつ出すとコンボが発生し、3 回分の技のダメージに加えて
さらに B ダメージを敵に与えられます。

「技 1,2,3 の中から自由に 1 つを選んで 1 回出す」という操作を 3 回繰り返すとき、
敵に与えられるダメージの最大値を求めてください。

制約

  • 1≤A1​≤A2​≤A3​≤100
  • 1≤B≤100
  • 入力はすべて整数

入力

入力は以下の形式で標準入力から与えられる。

A1 A2 A3 B
  • 1 行目には A1​,A2​,A3​,B がこの順に半角スペース区切りで与えられる

出力

答えを 1 行で出力してください。


入力例 1

1 2 3 4

出力例 1

10

技 1→2→3 の順に 1 回ずつ出すと良いです。

この場合、技 1 で 1 ダメージ、技 2 で 2 ダメージ、技 3 で 3 ダメージを敵に与えることができ、
さらにコンボが発生することによって 4 ダメージを追加で与えられます。

よって、合計 1+2+3+4=10 ダメージを敵に与えられます。

これより大きなダメージを敵に与えることはできません。


入力例 2

3 9 9 3

出力例 2

27

例えば、技 2 を 3 回連続で出すと良いです。
この場合、9×3=27 ダメージを敵に与えられます。

技 1,2,3 をこの順に 1 回ずつ出す場合、技 1 で 3 ダメージ、技 2 で 9 ダメージ、技 3 で 9 ダメージ、コンボ発生で 3 ダメージを敵に与えられますが、これらの合計は 24 ダメージとなり、
27 ダメージより小さくなります。


入力例 3

77 77 77 77

出力例 3

308

解答例

using static System.Math;
var a = new int[4];
string[] line = Console.ReadLine().Trim().Split(' ');
a[0] = int.Parse(line[0]);
a[1] = int.Parse(line[1]);
a[2] = int.Parse(line[2]);
a[3] = int.Parse(line[3]);
Console.WriteLine(Max(a[2] * 3, a.Sum()));
問題2

問題文

01 からなる長さ N の文字列 S,T が与えられます。S に対して以下の操作を行って T と一致させるための操作回数の最小値を求めてください。

  • 1≤iN を満たす整数 i を選ぶ。S の i 文字目を現在とは異なる方の文字に変更する。つまり、 0 なら 1、 1 なら 0 に変更する。その後、S の前後を反転する。

制約

  • N は整数
  • 1≤N≤106
  • S,T は 01 からなる長さ N の文字列

入力

入力は以下の形式で標準入力から与えられる。

N
S
T

出力

答えを 1 行で出力してください。


入力例 1

3
001
010

出力例 1

2

操作の一例を以下に示します。

  • i=2 として操作を行う。S の 2 文字目を 0 から 1 に変更し、S の前後を反転する。操作後、S110 となる。
  • i=1 として操作を行う。S の 1 文字目を 1 から 0 に変更し、S の前後を反転する。操作後、S010 となる。

2 回未満の操作で S と T を一致させることはできません。


入力例 2

2
01
11

出力例 2

1

操作の一例を以下に示します。

  • i=1 として操作を行う。S の 1 文字目を 0 から 1 に変更し、S の前後を反転する。操作後、S11 となる。

入力例 3

4
1111
1111

出力例 3

0

入力例 4

10
0110111010
1001010011

出力例 4

5

解答例

※ 次週

今回の演習問題

問題1

問題文

Mikeは、「不思議なポケット」を手に入れた。

「不思議なポケット」は、いくつかビスケットを入れて叩くと、入れたビスケットの数が2倍になる。
Mikeは最初1枚のビスケットを持っていて、「不思議なポケット」を使ってちょうどN枚のビスケットにして、全部食べたいと思っている。
(食べきれないので枚数をオーバーしてはいけない)

この時、ちょうどN枚にするには、Mikeは最低何回ポケットを叩く必要があるか求めてください。

制約

  • 1≤N​≤108
  • 入力はすべて整数

入力

入力は以下の形式で標準入力から与えられる。

N

出力

Mikeが叩くポケットの最小回数を出力してください。


入力例 1

3

出力例 1

2

初めに1枚のビスケットをポケットに入れて叩きます。
すると、2枚のビスケットになります。
2枚のビスケットになったうちの1枚をポケットに入れて、もう一度叩くと合計で3枚になります。
よって、2回叩くと3枚になります。


入力例 2

4

出力例 2

2

初めに1枚のビスケットをポケットに入れて叩きます。
すると、2枚のビスケットになります。
2枚のビスケットをそのまま、もう一度叩くと合計で4枚になります。


入力例 3

1000

出力例 3

10

問題2

問題文

本田君には競技プログラミングをやっている友達がたくさんいます。
いつも素数の魅力を語られる本田君は素数に嫌気がさしてしまいました。

そこで、友達の前で整数を使う時は、「素数,1,使う数自身」以外で割り切れる整数のみにすると決意しました。
そのために、与えられた整数が友達の前で使っても良いかを判定するプログラムを作ることにしました。

制約

  • N は整数
  • 1≤N≤1014

入力

入力は以下の形式で標準入力から与えられる。

N

出力

Nが友達の前で使っても良い整数ならYES、そうでなければNOを出力してください


入力例 1

30

出力例 1

YES

10や15などで割り切れるので本田君はこの整数を使えます


入力例 2

5

出力例 2

NO

1と5以外で割り切れないので本田君は残念ながらこの整数を使えません


入力例 3

1

出力例 3

NO

入力例 4

16777216

出力例 4

YES

コメント