Hello~! ミョウガです!
今回は「paizaオンラインハッカソン6」でプログラミングしてみました。
paizaオンラインハッカソン6には3種類の問題があるけど、ここでは緑川さんと六村さんの方をチョイスします。
https://paiza.jp/poh/joshibato/tsubame
https://paiza.jp/poh/joshibato/rio
霧島編はニアが書いたQiitaの記事を参照してね。
[C# / paiza POH] paizaオンラインハッカソン6(霧島編)を解く!
http://qiita.com/nia_tn1012/items/25bc3dcb0fb3343d5509
1. 緑川編を解く
まずは緑川編です。
2桁のランダムな数字Nを読み取り、NとNの十の位とNの一の位の和を求めます。
2桁の数字の場合、十の位は10で割った商、一の位は10で割った余りとなります。
using System;
class Program {
static void Main( string[] args ) {
int n = int.Parse( Console.ReadLine() );
Console.WriteLine( n + n / 10 + n % 10 );
}
}
実行結果
◆ 入力
97
◆ 出力
113
2. 六村編を解く
次は六村編だよ。
操作番号Mと量Qを読み取り、操作番号に応じて以下の3種類の操作を行います。コーヒーカップ内のお湯の量を W [g]、コーヒー粉末の量を P [g] とします。
- コーヒーカップにお湯を Q [g] 入れます。( W ← W + Q )
- コーヒーカップにコーヒー粉末を Q [g] 入れます。( P ← P + Q )
- コーヒーカップの中身を Q [g] 飲みます。( ( W, P ) ← ( W – Q × W / ( W + P ), P – Q × P / ( W + P ) ) )
この操作をN回行い、最終的なコーヒーの濃度( P / ( W + P ) × 100 [%] )を求めます。
これは操作番号Mをswitch文で分岐して、それぞれのcaseでお湯やコーヒー粉末を増やしたり、減らしたりすることで求まります。
using System;
struct CoffeeCup {
// コーヒー粉末
public double Coffee;
// お湯
public double Water;
}
class Program {
static void Main( string[] args ) {
CoffeeCup key = new CoffeeCup{ Coffee = 0.0, Water = 0.0 };
int n = int.Parse( Console.ReadLine() );
string[] s;
for( int i = 0; i < n; i++ ) {
s = Console.ReadLine().Split( ' ' );
switch( int.Parse( s[0] ) ) {
case 1: // お湯を追加
key.Water += int.Parse( s[1] );
break;
case 2: // コーヒー粉末を追加
key.Coffee += int.Parse( s[1] );
break;
case 3: // 味見
int c = int.Parse( s[1] );
double total = key.Coffee + key.Water;
key.Coffee -= c * key.Coffee / total;
key.Water -= c * key.Water / total;
break;
default:
break;
}
}
// コーヒーの濃度を出力します。
Console.WriteLine( Math.Floor( key.Coffee / ( key.Coffee + key.Water ) * 100 ) );
}
}
実行結果
◆ 入力
4
1 50
2 55
3 15
1 20
◆ 出力
42
ここで気をつけておきたいのが、31~33行目にある「味見」操作の処理です。式の右辺にあるお湯とコーヒー粉末の量は味見する前の値を使います。もし、case 3を以下のコードにしてしまうと、味見した後のコーヒーの量を使ってお湯の量を計算するので、正しくない値になります。ケアレスミスに気をつけてね!
case 3: // 味見
int c = int.Parse( s[1] );
key.Coffee -= c * key.Coffee / ( key.Coffee + key.Water );
key.Water -= c * key.Water / ( key.Coffee + key.Water );
break;
対策としては、味見前のお湯またはコーヒー粉末の量をキャッシュしておく、予めお湯とコーヒー粉末の和を別の変数に格納する、タプルなどを使って計算する方法があります。
ではでは、See you♪
コメント