算数オリンピックの問題 その9
メチャメチャだけど【随時更新】解答に必要な機能まとめ - ニート歴10年からの数学日記と【随時更新】計算量の減らし方まとめ - ニート歴10年からの数学日記を使って、算数オリンピックについて考察していく。
グラフや幾何学の問題や、記述に関するメタ的な問題以外の今までに無い種類の問題について考察する。
02年度ファイナル問題 問題5
『赤・青・黄・緑のカードが3枚ずつ計12枚あります。それぞれ同じ色のカードには同じ整数、異なる色のカードには異なる整数が書かれており、小さなものから赤、青、黄、緑の順になっています。
これらのカードを、6人の生徒に2枚ずつ、どの生徒にも同じ色のカードが2枚わたらないように配りました。6人の生徒が、自分に配られたカードの2つの整数の和を計算したところ、88、121、129、143、154、187となりました。しかし、この中で、一人だけ計算が間違っています。
これらのカードに書かれた異なる4つの整数を求めて、答えとして考えられる組み合わせをすべて書きなさい。答えは、赤・青・黄・緑の順に書きなさい。
(解答欄は4つありますがすべて使うとはかぎりません。)』
card_list := [R, R, R, B, B, B, Y, Y, Y, G, G, G];
R != B != Y != G;
R < B < Y < G;
students[0] := 移動で2つ := card_list;
students[1] := 移動で2つ := card_list;
students[2] := 移動で2つ := card_list;
students[3] := 移動で2つ := card_list;
students[4] := 移動で2つ := card_list;
students[5] := 移動で2つ := card_list;
every~{
students[?1][0] != students[?1][1];
};
{
students[0].+ == 88;
, students[1].+ == 121;
, students[2].+ == 129;
, students[3].+ == 143;
, students[4].+ == 154;
, students[5].+ == 187;
}.5;
,
{
students[0].+ != 88;
, students[1].+ != 121;
, students[2].+ != 129;
, students[3].+ != 143;
, students[4].+ != 154;
, students[5].+ != 187;
}.1;
結果における(R, B, Y, G);
後ろ側の、5つ正しくて1つ間違っているというのの記述は、もう少し良くならないだろうか。あと、[{ }, { }, { }]というような表記にした方が良いのではとも思わんでもない。
同じカードが2枚渡ることは無いとして、R+B < R+Y < B+Y < B+G < Y+G、後はR+GとB+Yがどちらが小さいかというだけ。この6通りで6人。
つまり、R+B=88、R+Y=121、B+G=154、Y+G=187、で真ん中にR+G=129かつB+Y=143、あるいはB+Y=129かつR+G=143。更にこの1つが間違えている。
(R+B)-(R+Y)=88-121、B-Y=-33。(B+G)-(Y+G)=154-187、B-Y=-33。それぞれの生徒の式において、1多かったり少なかったりしたらこうはならないはずなので、まあ最初の2人と最後の2人は正しいだろうと推測できる。
更に、B+Y=143だったら、B-Y=-33と合わせて、2*B=110、B=55、Yは88。B+Y=129だったら、2*B=96、B=48、Yは81。
それぞれ合っている4つの式と照合すれば、どちらが正しいかが出て、それぞれの記号の値も出るだろう。
もし4つの式のどれかが間違っていても、逆に言えば残りの2つが正しいということなので、やりようはあったと思う。1つの和しか間違っていないということを前提に、正しいはずの式と正しいはずの式から正しいはずの式を出して、その2つを照合することで4つの中に間違いがあるかを確かめた。もし合わなければ、どれか1つが間違っているということ。変な問題だったと思う、こんなの自動でできるんだろうか。
03年度トライアル問題 問題3
『真っ暗な夜。川のこちら岸にA、B、C、Dの4人がいます。向こう岸に行くには小さな橋を渡らなければいけません。橋は小さくて同時に2人までしか渡れません。また、橋を渡るときには懐中電灯が必要ですが、懐中電灯はたった1つしかありません。つまり2人で向こう岸に渡り、1人は懐中電灯を持ってもどり、また2人で向こう岸に行く、ということを繰り返さないと4人全員が渡ることはできません。
①Aはこの橋を1人で渡ると1分かかります。
②Bはこの橋を1人で渡ると1分30秒かかります。
③Cはこの橋を1人で渡ると2分かかります。
④Dはこの橋を1人で渡ると2分30秒かかります。
⑤2人で渡る時は、2人のうちの遅い人の速さで渡ります。
という条件のとき、4人全員が向こう岸に渡り終えるまでに最短で何分かかりますか。』
A := 60;
B := 90;
C := 120;
D := 150;
people := [A, B, C, D];
time := 0;
{
person_1 := 移動で1 := people;
person_2 := 移動で1 := people;
{
person_1 > person_2;
time := time + person_1;
,
person_1 < person_2;
time := time + person_2;
}.1;
{
people.数 == 0;
終了;
,
それ以外;
}.1;
{
time := time + person_1;
people := 移動 := person_1;
,
time := time + person_2;
people := 移動 := person_2;
}.1;
}
~;
timeを最小化するように命令;
結果におけるtime;
たまに、andにしたいけど視覚的に離したい時に「,」を使ったりするから、「{ }」と「,」で表現するのはそれとの整合性が取れないかもしれない。そうすると、「[ ]」とその中の「{ }」だろうか。「[ ]」は横で「{ }」は前方向か?まあよく分からない。
人間だったらすぐに分かるんだけどな。AはBの上位互換だから、Bを戻すよりAを戻した方が必ず結果は短くなる。またどうせ戻ってくるなら、他よりAを行かせた方が絶対に良くなる。BCDの順番は結果に影響を与えない。90+60+120+60+150=480。上位互換というのがキーだと思うけど。
03年度トライアル問題 問題11
『例えば3と5の間に6、30、20の3個の整数を入れると、
3、6、30、20、5
で、すべてのとなりあう2つの数の和はその2つの数の積の約数になります。(例えば、3+6=9は、3*6=18の約数です。また6+30=36は6*30=180の約数です。)
4と3の間に0以外の3個の整数を入れて、どのとなりあう2つの数の和もその2つの数の積の約数になるように組み合わせを求めなさい。
(複数の組み合わせが考えられる場合は、そのうち1組を書けばよいこととします。)
4、( )、( )、( )、3』
(4 + A) * ? == 4 * A;
(A + B) * ? == A * B;
(B + C) * ? == B * C;
(C + 3) * ? == C * 3;
結果における(A, B, C);
この「(C + 3) * ? == C * 3」、つまり?かCのどちらかが3の倍数でなければならない。仮に?が3の倍数、仮に「3*x」としてみる。すると「(C + 3) * 3*x == C * 3」で、「(C + 3) * x == C」。これはxが約数で無ければ無理だ。よって、?は3の倍数では無いし、かつCは3の倍数だと分かる。
で、まあ3の倍数で探していっても6しか見つからないので、答えを見る前は仮に6と考えてみることにする。
この理屈は4でも同じであるはずだから、Aも4の倍数で探してみる。
ここで気付いたのだが、Aを4の倍数だとして、「A = 4 * a」としてみて、「(4 * a + 4) * ? = 4 * a * 4」、「4 * (a + 1) * ? = 4 * 4 * a」、「(a + 1) * ? = 4 * a」となって、?が4の倍数で無いとすると、(a + 1)は少なくとも4の約数である必要がある。これに当てはまるaは1と3だ。実際に、4と12で成立する。
そうしてみると、(c + 1)も3の約数である必要があって、これに当てはまるcは2しかあり得なかった。つまり6でしか成立しなかった。
確定している「(B + C) * ? == B * C」も同じ手順で、「(B + 6) * ? == B * 6」、「B = 6 * b」としてみて、「(6 * b + 6) * ? = 6 * b * 6」、「(b + 1) * ? = 6 * b」。?は6の倍数では無いので、少なくとも(b + 1)は6の約数。bは1か2か5。つまりBは6か12か30。実際に確認してみると、どれでも成立する。
つまり「(A + B) * ? == A * B」は、Aが4か12、Bが6か12か30、この2*3で6通りにまで絞れた。少ない方、制約が強い方を起点に、仮にAを4としてみる。
「(4 + B) * ? = 4 * B」、Bを「B = 4 * b」としてみて、いろいろ飛ばして、(b + 1)は少なくとも4の約数で無ければいけない。これに当てはまるbは1と3だけで、つまりBは4か12。12が当てはまった。
次に、「(12 + B) * ? = 12 * B」、Bを「B = 12 * b」としてみて、いろいろ飛ばして、(b + 1)は少なくとも12の約数で無ければいけない。これに当てはまるbは1と2と3と5と11だけで、つまりBは12か24か36か60か132。12が当てはまった。
困ったな。しかし、よく考えてみたんだが、Bが12なら、Aも12の倍数で、つまりAも12なのではないか。
それで答えは、A=12、B=12、C=6。実際に試してみると正しかった。
「?かCのどちらかが3の倍数でなければならない」が、一方が矛盾。Cが3の倍数だとすると、(c + 1)が3の約数である必要があって、そこから答えが出た。式における倍数や約数が制約として使えないか着目する、というのが今回の教訓になるか。我ながらよくできた、何だか面白かった、IQ60の小学6年生と張り合うのもどうかと思うけど。
03年度トライアル問題 問題14
『池の周りを、同じ地点からAとBが同時に同方向に一定の速さで走り出します。出発の時のBの速さはAの2.5倍です。1回目にBがAに追いついた地点をPとします。追いついたBはその速さを20%減らし、追いつかれたAは速さを25%増しました。それでもBのほうが速かったので、BはAにまた追いつきました。2回目に追いついた地点をQとします。PとQの道のりが100m離れているとき、この池の周囲の長さは何mですか、考えられる長さをすべて求めなさい。』
A * 2.5 == B;
A * time + pond == B * time;
P := B * time;
B := B * 80 / 100;
A := A * 125 / 100;
time := time + X;
A * X + pond == B * X;
Q := B * X + P;
Q - P == 100;
結果におけるpond;
まず、わざわざQにPを足したけど、そこからまたPを引いたら100ということで、「B * X == 100」。
「A * X + pond == B * X」から、「A * X + pond == 100」。で、問題はAとBの関係で、これさえ分かれば「B * X == 100」で答えが出る。
後者のBを基準にするとして、前者のBは「B * 100 / 80」。そして前者のAとBの関係の式である「A * 2.5 == B」から、前者のAは「A * 2.5 == (B * 100 / 80)」、「A == B * 5 / 4 / 2.5」、「A == B / 2」。更に後者のAはそれを基準に「A * 125 / 100」なので、「(B / 2) * 5 / 4」、「B * 5 / 8」。
よって、「A * X + pond == 100」にその後者のAを代入して、「(B * 5 / 8) * X + pond == 100」、「B * X == 100」なので「100 * 5 / 8 + pond == 100」、「125 / 2 + pond == 200 / 2」、「pond == 75 / 2」。これが答えだろう。
最初はゴチャゴチャ悩んでtimeとXの関係を出したりしていたけど、結局はこういうことだった。答えは確認していない。