メチャメチャだけど【随時更新】解答に必要な機能まとめ - ニート歴10年からの数学日記と【随時更新】計算量の減らし方まとめ - ニート歴10年からの数学日記を使って、算数オリンピックについて考察していく。
グラフや幾何学の問題や、記述に関するメタ的な問題以外の今までに無い種類の問題について考察する。
『長さがすべて異なる7本の直線があります。いちばん短い直線の長さは1cm、いちばん長いのは21cmです。この7本の直線から3本をえらんで三角形を作ろうと思いましたが、どのように3本をえらんでも三角形を作ることができませんでした。2番目に長い直線の長さは何cmですか。』
直線[A, B, C, D, E, F, G] <- 7 <- [1~21]のカブり無し;
A < B < C < D < E < F < G;
A = 1;
G = 21;
[3本] <- 3 <- [A, B, C, D, E, F, G];
全ての場合において、[3本]の[最大] >= [3本]の[最大以外]の[全部で+]; (ここは何か違う気がする、全ての場合において、は一つ前ではないか)
[結果]におけるF;
「最大 >= それ以外の総和」というルールに沿って1と2から組み立てていけば出る。1,2,3,5,8,13,21。
1と2から始めて、直前までの最大2つの総和とイコールのものが、最終結果を小さくするには最善であることをハッキリさせれば良い。例えば1と3から始めると、3は(2+1)なので最善にはならない、というようなイメージ。
もしそれで最終結果が21より小さければ、今度はまた違う問題になる。
『2人の生徒が次のルールで、交互に黒板に数字を書いていくゲームをしています。
ルール① 1から10までの数の中から1つを選んで数字を交互に書いていく。
ルール② それまでに書かれた数の約数は書けない。(例えば、黒板に「9」と書かれたら、それ以降は1、3、9は書けない)
ルール③ パスはできない。
というルールで、数が書けなくなった人が負けです。
このゲームはうまく数を選ぶと、先手が必ず勝てます。では、先手ははじめに1から10のうちのどの数を書けば必ず勝つことができるでしょうか。』
数字[1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
[ゲーム] <- [
[プレイヤー1], [プレイヤー2] <- [
[選択した数字] <- 移動で1 <- [数字];
[数字]の[?1: 選択した数字 = ?1 * ?2]を除去;
[
[数字] = [];
自分の目的。
終了;
,
それ以外;
]の1つ;
];
[
[プレイヤー1];
[プレイヤー2];
]
~;
];
[プレイヤー1]が勝つように[ゲーム][0][プレイヤー1]の[選択した数字]を設定;
[結果]における[ゲーム][0][プレイヤー1]の[選択した数字];
ゲームの問題は相手を封じるか、全通りを出すか。
9、3、1という順番で含まれて、また8、4、2、1という順番で含まれる。2、3、6という順番でも含まれる。5と7は素数。
5と7はどのタイミングで来ても、相手が取った時にもう片方を取れば良い。ので、この9と8と6の約数たちの中で、最後に取ったら勝ちという風に単純化できる。
で、後は大きい数から順に試して、俺の考えでは2だった。
答えを見ると、俺はうっかりミスで10を忘れていて、答えは4か6だった。相手に対応するような(同じような?)動きをして、勝利まで到れるようにする。解答へのアプローチという意味では総当たりで同じだった。
『1999Lの水が入った容器Aと、同じ大きさのからの容器Bがあります。1回目はAの1/2の量をBへ移します、2回目はBの1/3をAに移します、3回目はAの1/4をBへ移します、次はBの1/5をAへ………この方法で次々と移していきます。1999回目にAからBへ移した時、Bの容器には何Lの水が入っていますか。』
[容器A] <- 1999;
[容器B] <- 0;
[カウント] <- 1;
[
[カウント] <- +1;
[容器A] <- [容器A] - [容器A] / [カウント];
[容器B] <- [容器B] + [容器A] / [カウント];
[
[カウント] = 2000;
終了;
,
それ以外;
]
[カウント] <- +1;
[容器B] <- [容器B] - [容器B] / [カウント];
[容器A] <- [容器A] + [容器B] / [カウント];
]
~;
[結果]における[容器B];
前方向に続くフローを軽くする方法としては、まあ並列化するかルールを掴むか、だよね。
で最初の方を書き出してみてルール的に、Aから渡す時はいつもなぜか1/2になってるので、答えは1/2。
この「<-」、普通のプログラミング言語みたいに「=」で良いかもな。でイコールは「==」。
いやでもそうすると、矢印の間に個数とかの指定を挟むのが読みにくいか?それなら「:=」かな。試してみるか。
まああんまりこだわりは無いんで、できるだけC言語とかポピュラーなものに近づけるのもアリかもしれない。
『ある人が下りエスカレーターに乗り、1段ずつ下りていったら28歩で下につきました。同じ人が下りたときの5倍の速さで、このエスカレーターを駆け上がったら56歩で上につきました。停止しているときにはエスカレーターは何段ありますか。』
これは答えを見た。
時間が、5倍の速さで56歩進んだということは、元の速さに戻すと11.2歩分の時間。28 / 11.2 = 2.5で、かつエスカレーターの進む速度は同じなので、後からのを基準にすると、元のは2.5倍進んでいると分かる。
28 + 2.5X = 56 - X (←逆行だと進んだ分引かなければいけない)。3.5X = 28、7X = 56、X = 8。
56 - 8 = 48、あるいは28 + 2.5 * 8 = 48。答えは48。
こういう速さとかで式を立てる問題苦手だなー。最初立てた式なんかあまりにもトンチンカンで、流石に恥ずかしくて消してしまった。
求められている答えはエスカレーターの長さなんだから、最初から長さを基準にして式を立てれば良かったのかな。時間は分かったんだけど。
式を立てる問題はスルーしてたけど、いつか一回まとめた方が良いかもしれない。自然言語を式にするだけで新しく分かることなんて無いと思っていたけど。
『図のように大きな長方形を、9つの面積が異なる小さな長方形に分け、①〜⑨の番号をつけました。⑤の面積が最大で⑨の面積が最小です。この9つの長方形のうち3つの長方形の周囲の長さが等しくなるとすると、どれとどれとどれでしょうか。番号で答えなさい。(図は正確ではありません。)
(図)①②③
④⑤⑥
⑦⑧⑨』
長方形[[A,B], [A,D], [A,F], [C,B], [C,D], [C,F], [E,B], [E,D], [E,F]];(①をA×B、⑤をC×D、⑨をE×Fとして)
?? [長方形]のそれぞれの[[?1][0]*[?1][1]]は≠;
[長方形]の[[?2][0]*[?2][1]]の最大 = C * D;
[長方形]の[[?2][0]*[?2][1]]の最小 = E * F;
?? [長方形]の[[?][0] * 2 + [?][1] * 2]の3つは=;
[結果]における[長方形]の[?3, ?4, ?5: [?3][0]*2 + [?3][1]*2 = [?4][0]*2 + [?4][1]*2 = [?5][0]*2 + [?5][1]*2];
縦横に共に⑨に関する辺が一番小さい。③⑥⑦⑧は、それぞれもう一辺は⑨より大きくないといけないし、その組み合わせである他も同じ。似たような話で⑤に関する辺も一番大きい。①に関する辺はだから中くらい。縦と横で辺の長さが被ることはあり得ないので(なぜなら長さが同じならもう一辺も同じになってしまうし、そうすると面積も同じになってしまう)、①②③を基準に考えても6通り。小さい辺と大きい辺の組み合わせ2つと中くらいの組み合わせの、①⑥⑧が答え。
という風に書いてあって、だから実際そうなのだろうけど、例えば縦3つの辺の一番長いものと横3つの辺の中くらいのもので、縦3つの一番長いものの方が長いと言えるんだろうか。寝不足なので、そこが今はよく分からない。
表記法がゴチャゴチャしているので、また近い内に概念を整理する必要があるだろう。自分の中でハッキリしていない。