過去ず珟圚を䜿甚する

はじめに



こんにちは 私は数孊孊郚の孊生であり、3幎生で、数孊ずコンピュヌタヌサむ゚ンスの䞡方でパヌトCの統䞀囜家詊隓の問題を解決するこずに興味を持぀ようになりたした。



残念ながら、情報孊の詊隓はあたり泚目されおいたせん。 なぜ私がそう決めたのか尋ねたすか はい、少なくずも、7幎の間に数孊の課題は幎ごずに根本​​的に倉わっおきたしたが、コンピュヌタヌサむ゚ンスではそれらが倉わっおいたせん。 毎幎同じ仕事を芋たした。 そしお、あなたは䜕を知っおいたすか コンピュヌタサむ゚ンスの詊隓が䞀皮の「同じ問題の解決策を手に入れ、䞊䜍5぀を獲埗する」に倉わっおいるため、これは本圓に疲れおいたす。



2012幎に、コンピュヌタヌサむ゚ンスの詊隓が぀いに泚目されたした。 そしお、それは倉曎されたしたそしお、3぀すべおの郚分A、B、C。



7幎間の䜜業ず、2012幎にどのように倉曎されたかに関心があるすべおの人に、タックルをお願いしたす。 Cの郚分を怜蚎したす。正確に蚀えば、Cの郚分の方が興味深いからです。 コンピュヌタサむ゚ンスのAずBの郚分も非垞に深刻に倉曎されおいたすが、興味がある堎合は次回怜蚎したす。



2012幎より前のタスク



C1

問題C1は、グラフィカルに定矩された特定の領域のポむントをヒットする叀兞的な問題です。 これらのタスクで最初の1幎間にどのように蒞したのかを芚えおいたす...

実際に問題の状態



平面䞊の点の座暙をキヌボヌドから読み取りx、yは実数、この点の特定の圱付き領域境界を含むに属するかどうかを刀別するプログラムを䜜成する必芁がありたした。 プログラマヌは急いでいお、プログラムを間違っお曞いた。



パスカルプログラム

 var x、y実数;
始める
   readlnx、y;
     y <= xの堎合
       y <=-xの堎合
         y> = x * x-2の堎合
           曞き蟌み「所属」
        他に
           曞きたす「所属したせん」
終わり。


画像



次の手順が順番に必芁です。

1プログラムが問題を誀っお解決するような数倀x、yの䟋を挙げおください。

2プログラムの修正方法を瀺しお、䞍正な操䜜のケヌスがないようにしたす。 これはいく぀かの方法で実行できるため、゜ヌスプログラムを改良するための正しい方法を指定できたす。



それぞれのポむントをやっおみたしょう。



1パラグラフ1を解決するには、元のプログラムの動䜜を理解する必芁がありたす。 少し話し合った埌、ポむントが赀で匷調衚瀺された領域に該圓するかどうかをチェックするず結論付けるこずができたす。 ぀たり、灰色の領域に属し、赀色の領域に属さないポむントは、質問に察する答えです。 たずえば、x = 2、y = 2たたはx = 0.5、y = 0.5たたはx = -0.5、y = 0.5これらのポむントのいずれかを遞択したす。

画像



2統䞀状態詊隓で最も䞀般的なプログラミング蚀語はPascalDelphiであるため、入力されたポむントが特定の領域に属するかどうかを刀断する正しいプログラムを曞き蟌みたす。 これを行うには、瞊座暙軞を基準にしお2぀のポむントセットに領域を分割したすx <= 0、x> = 0

 var x、y実数;
始める
   readlnx、y;
     ify> = x * x-2andy <= xandx> = 0orx <= 0andy <=-xandy> = x * x-2 その埌
     曞き蟌み「所属」
      他に 
    曞く「所属しない」;   
終わり。


if-eの最初の条件は、ラむラック領域が属し、2番目の条件が青であるこずを意味し、それらの和集合を取りたす。



画像



さお、これでタスクC1がわかりたした。 簡単ですね。



C2

問題C2は、配列内のデヌタを凊理するためのかなり単玔なタスクです。たずえば、配列の偶数芁玠の算術平均を蚈算したす。

特定の䟋を考えおみたしょう



30芁玠の敎数配列を指定したす。 配列の芁玠は、0から1000たでの倀を取るこずができたす。ロシア語たたはプログラミング蚀語の1぀で、奇数倀を持぀配列芁玠の算術平均を蚈算および導出できるアルゎリズムを蚘述したす。 ゜ヌス配列では、少なくずも1぀の芁玠の倀が奇数であるこずが保蚌されおいたす。



解決策

定数N = 30;
倉数a敎数の配列[1..N]。
        i、x、y敎数;
        s本物;
始める
    for i= 1からN 
       readlna [i];
 x= 0;  y= 0;
 for i= 1からN
     ifa [i] mod 2 = 1then 
      始める
         x= x + a [i];
         y= y + 1;
      終わり;
   s= x / y;
 writelns;
終わり。


このタスクでは、コメントも非垞に単玔であるため、䞍芁です。 このタスクの倉曎はより耇雑でしたが、たずえば...配列の芁玠の算術平均、桁数の合蚈を蚈算しお導出するには、奇数です。 タスクは単玔ですが、1桁耇雑です。



C3



画像



おそらくこれが最も悪名高いタスクです。 圌女はみんなにうんざりしおいたした小孊生から教垫たで。 詊隓をチェックする先生は、ほずんどの堎合、この特定のタスクに぀いお䞍満を述べおいたす。 うんざり 」。



客芳的に刀断するず、このタスクはコンピュヌタヌサむ゚ンスずはたったく関係ありたせん。 なぜ圌女は7幎間Cナニットに座っおいるのですか わかりにくい



実際には、タスクは2人のプレむダヌがプレむしお動きを出すゲヌムです。 これらの䞍幞な問題の1぀ずその解決方法を怜蚎しおください。 ずころで、2012幎に根本的に倉わったのはこのタスクでした。

タスクの条件は次のずおりです。



2人のプレむダヌが次のゲヌムをプレむしたす。 それらの前に石の山が2぀ありたす。最初の石には3぀、次の4぀には石がありたす。 各プレむダヌは無制限の数の石を持っおいたす。 プレむダヌは亀代したす。 動きは、プレむダヌがいく぀かの山の石の数を倍にするか、いく぀かの山に4぀の石を远加するこずです。 移動埌、2぀の山の合蚈石数が25を超えたプレむダヌは負けたす。 䞡方のプレむダヌが正しくプレむしたずきに誰が勝ちたすか-プレむダヌが最初の動きをするか、プレむダヌが2番目の動きをするか 勝者の最初の動きは䜕ですか 答えを正圓化したす。



この問題を解決するには、ゲヌムツリヌを構築する必芁がありたす。 明らかに負けおいない䞡方のプレヌダヌの可胜なすべおの動きを考慮しおくださいプレヌダヌは自分の䞍利益に行くこずはできたせん。



画像



ゲヌムツリヌは、最初のプレむダヌがどのように䞡方の山の石の総数に䌌おいおも、25を超えるため、負けるこずを瀺しおいたす。 したがっお、正しいゲヌムでは、2番目のプレむダヌが勝ちたす。



たあ、それだけです。 C3では、私たちも理解したした 圌女はあなたにどうですか 私にずっお-非垞に退屈。 このタむプの問題を数回解決した堎合、問題は発生したせん



C4

正盎に蚀うず、私はC4タスクが奜きではありたせん。 半ペヌゞあたりの条件の1぀は䟡倀がありたす。 残念ながら、このタスクは孊生のアルゎリズムの知識をテストするものではなく、より技術的なものです。

タスクの条件は次のずおりです。



プログラムの入り口で、特定の高校の9幎生の生埒による詊隓の合栌に関する情報が提䟛されたす。 最初の行は、少なくずも10人で100人を超えない孊生数Nを報告したす。次の各N行の圢匏は次のずおりです。<Last Name> <First Name> <marks>。文字、<Name>は15文字以䞋の文字列です、<statements>-スペヌスの埌、5ポむントシステムによる掚定に察応する3぀の敎数。 <Surname>ず<Name>、および<Name>ず<studies>は1぀のスペヌスで区切られたす。 入力行の䟋

むワノフピヌタヌ4 5 4

平均的な3人の生埒の姓ず名前を衚瀺するプログラムを䜜成する必芁がありたす。 残りの䞭で、3぀のベストの1぀ず同じ平均スコアを獲埗した生埒がいる堎合、姓ず名前を衚瀺する必芁がありたす。 必須の姓ず名をランダムな順序で衚瀺できたす。



私自身はこの問題を自分で解決するためのハンタヌではないので、USEコヌドの䟋怜蚌甚のサンプルを瀺したす。



解決策
 var pレコヌドの配列[1..100]
                         名前文字列;
                          sum敎数;
                       終わり;
     cchar;
     i、j、N、s1、s2、s3、m敎数;
始める
   readlnN;
   for i= 1からN
  始める
     p [i] .name= '';
    繰り返す
      読み取りc;
       p [i] .name= p [i] .name + c
     c = ''たで  {姓を読む}
    繰り返す
      読むc;
       p [i] .name= p [i] .name + c
     c = ''たで  {名前を読む}
     p [i] .sum= 0;
     j= 1から3 do
    始める
      読み取りm;
       p [i] .sum= p [i] .sum + m
    終わり;  {蚈算された合蚈ポむント}
     readln;
  終わり;
 s1= 0;  s2= 0;  s3= 0;
   for i= 1からN
  始める
     p [i] .sum> s1の堎合
      始める
         s3= s2;  s2= s1;
         s1= p [i] .sum
      他の終わり
     p [i] .sum> s2の堎合
      始める
         s3= s2;  s2= p [i] .sum
      他の終わり
     p [i] .sum> s3の堎合、s3= p [i] .sum;
  終わり;
   for i= 1からN
     p [i] .sum> = s3の堎合、writelnp [i] .name;
終わり。




私には、C4タスクはわずかに異なる性栌を持っおいるように思われたす。぀たり、技術的な知識に加えお、゜ヌト、デヌタ構造などの孊生のアルゎリズム的な知識もチェックする必芁がありたす。 䞀般に、このタスクは実装は簡単ですが、゜リュヌションを解明するのは難しいず思いたす。 今、正反察は解決するのは簡単ですが、曞くのは難しいです。



2012幎のタスク



C1

詊隓のコンパむラは、特定の領域にポむントを取埗するタスクが耇雑すぎるず刀断したようです私にずっおは、これはたったくありたせん。 タスクC1は文字通り単玔化されたした。 珟圚、座暙系の代わりに数倀線が考慮され、領域の代わりにセグメントの結合が考慮されおいたす。 入力した番号でセグメントに属するかどうかを刀断する必芁がありたす。



画像

このすでに簡単なタスクを単玔化する必芁があった理由は明らかではありたせん



C2

このタスクは倉曎されおいたせん。 配列の芁玠を凊理する必芁がありたす。



C3

しかし、このタスクは根本的に倉わりたした。

条件は次のずおりです。



実行者Utroitelには、番号が割り圓おられた2぀のチヌムがありたす。

1. 1を远加

2.回3。

それらの最初はスクリヌン䞊の数を1増加させ、2番目はそれを3倍にしたす。 トリプルのプログラムは䞀連のコマンドです。

番号1を番号29に倉換するプログラムはいく぀ありたすか 答えを正圓化したす。



それを読んだ埌に最初に思い぀いたのは、必芁なプログラムの数を蚈算する再垰関数を曞くこずでした。 しかし、問題の状態をもう䞀床読んだ埌、私はそのような答えがうたくいかないこずに気付きたした。 プログラムではなく、理にかなった答えが必芁です。 この問題では、動的プログラミングに぀いお話しおいるこずは明らかです。



次に、コヌド化機胜の゜リュヌションを瀺したす。

Rnを、数倀1を数倀nに倉換するプログラムの数ずしたす。 tnで、nを超えない3の最倧倍数を瀺したす。 ゚グれキュヌタヌの䞡チヌムは初期数を増やすため、プログラムのチヌムの総数は28を超えるこずはできたせん。

次の関係が圓おはたりたす。

1. nが3で割り切れない堎合、Rn= Rtn。これは、tnからnを取埗する唯䞀の方法であるため、単䜍を远加するこずです。

2. nを3で割り切れるようにしたす。

次に、Rn= Rn / 3+ Rn-1= Rn / 3+ Rn-3n> 3の堎合。

n = 3の堎合、Rn= 22぀の方法2぀のナニットを远加するか、

3による乗算。

したがっお、すべおのRnの倀を埐々に蚈算するだけで十分です。

3の倍数で29以䞋最初にR1を蚈算し、次にR3、R6などを蚈算したす。

ありたす

R2= 1

R3= 2 = R4= R5

R6= R2+ R3= 1 + 2 = 3 = R7= R8

R9= R3+ R6= 2 + 3 = 5 = R10= R11

R12= R4+ R9= 2 + 5 = 7 = R13= R14

R15= R5+ R12= 2 + 7 = 9 = R16= R17

R18= R6+ R15= 3 + 9 = 12 = R19= R20

R21= R7+ R18= 3 + 12 = 15 = R22= R23

R24= R8+ R21= 3+ 15 = 18 = R25= R26

R27= R9+ R24= 5 + 18 = 23 = R28= R29

回答23



私にずっお、このタスクはゲヌムよりもはるかに興味深いものです。 少なくずも、孊生は動的プログラミングの抂念を理解する必芁がありたす。

どう思いたすか



C4

今幎のC4目暙もわずかに改善されたした。 これで、前のタスクC4のようにこれらの姓ず名前を読む必芁はありたせん。 実際の状態は次のずおりです。



加速噚では、倚数の粒子に぀いお、それぞれの速床が枬定されたす。 ドキュメンテヌションで実隓のあるシリヌズず別のシリヌズを定性的に区別するために、各シリヌズは、さたざたな粒子の速床のペアのすべおの積の最倧積に等しい数で特城付けられるように決定されたした。

メモリで䜿甚されるものを含む効果的なプログラムを䜜成しお、実隓の結果を凊理し、目的の倀を芋぀けたす。 このモデルでは、粒子速床は正ず負の䞡方の倀を取るこずができる量です。 速床が枬定される粒子が倚数存圚する可胜性がありたすが、2未満であっおはならないこずに留意しおください。

粒子の数N

サンプル入力

5

123

1000

-12

10

1000

プログラムは、さたざたな粒子の速床のペアのすべおの積の最倧積に等しい単䞀の敎数を出力する必芁がありたす。

䞊蚘のサンプル入力のサンプル出力

1,000,000



この問題では、倚くの条件が蚭定されたす。 たず、プログラムを時間ずメモリ内で可胜な限り効率的に蚘述する必芁がありたす。 第二に、倧量のデヌタが存圚する可胜性があるずいうこずです。 これは、入力デヌタを配列に曞き蟌むこずにした堎合、効果的な解決策が埗られないずいう埮劙なヒントです。 この問題を解決する玠朎な方法すべおを配列に曞き蟌み、配列の芁玠をダブルサむクルしお、目的の数を芋぀けたす。 明らかに、このようなアルゎリズムにはOn * n時間ずOnメモリが必芁です。 これは悪いこずです...このような決定に察しお、4点のうち最倧2点を獲埗できたす。



少し反省すれば、元の数倀は2぀の笊号付き数倀の積で構成されおいるため、2぀の最倧入力数倀たたは2぀の最小入力数倀であれば最倧になるこずが理解できたす。 ぀たり、2぀の最倧数ず2぀の最小数を芋぀けお、それらの積を比范しお答えを出す必芁がありたす。 そしお、これらすべおは、デヌタを配列に保存するこずなく、1぀のパスで実行できたす。



このタスクは、以前のC4のタスクよりもはるかに優れおいるず思いたす。



おわりに



さお、ここでは、コンピュヌタヌサむ゚ンスに関するパヌトCの詊隓のタスクに぀いお説明したす。 詊隓の準備をしおいた孊生がすべおのタスクを利甚できるこずを嬉しく思いたす。 たた、任意のプログラミング蚀語怜蚌者だけがこの蚀語を知っおいればPython、PHP、Basicがありたしたでプログラムを䜜成できるこずをお勧めしたす。



叀いものや新しいものが奜きなタスクは䜕ですか



All Articles