何をどのように書くか(パート1. EclipseとJava)

画像 ...

画像

前の投稿を続けます。



すぐに予約します。いいえ、 これらの写真でJavaやC ++を屈辱しようとはしていません 。 または、そのような言語は特定の言語よりも優れているとさえ言います。 異なるタスクには異なる言語がより便利であることを示したいだけです。 このトピックでは、Olympiadプログラミング用のIDEを選択するためのヒントを読むことができますが、Javaがより便利な場合のいくつかを検討します。



IDE

IDEは何のためですか? ACMに書き込むコンピューターは、まったくあなたのものではありません。 他の9,000の競合他社とまったく同じです。 そして、あなたのお気に入りの、おそらくエキゾチックな開発環境がそこにない可能性は十分あります。 そして、これはこれです:

したがって、選択は大きくありません。 MS VSおよびEclipseの廃止バージョン。 ちなみに、常に最新バージョン。 まあ遠いが、これはIDEではありません。 したがって、私は怠け者であり、Eclipseについてのみ書きます。



パターン

おそらく最初に教えられたのは、Eclipseでテンプレートを作成することでした。 テンプレートを使用すると、プログラムを記述するためのフレームワークをすばやく、非常にすばやく作成できます。 テンプレートに代わって3文字または4文字を書き、ボタンの組み合わせ(Ctrl +スペースバー)を押して、エディターウィンドウでプログラムの既製のフレームワークを見つけるだけで十分です。 それらの作成方法については、 こちらをご覧ください



ボタン+その他のボタン(+その他のボタン)

キーボードショートカットは、オリンピックが大好きなEclipseです。 Ctrl +スペースバーを押して、優れた自動置換を使用する機会が常にあります(Visual StudioユーザーはこれをIntelliSenseとして知っています)。 コードを選択するには、 Ctrl + /を押して/のコメントを解除します。 Ctrl + Alt +↓または押して現在の行を上下にコピーしたり、 Ctrl + Dを押して現在の行を削除したりできます...または、設定に入り、そこで組み合わせのリストを見つけ、必要なものを覚えておくことができます。



Javaで記述する方法とタイミング

Javaでプログラミングする際に最初に対処する必要があるのは、自分でビッグスタックを取得することです。このスタックは、別のスレッドで実行できます。 2つ目は、データをすばやく読み書きする方法を学ぶことです。 Eclipseの現在のテンプレートを提供し、予備的なコメントを提供します。 何か明確でない場合は、説明できます。

import java.io.BufferedReader;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.StringTokenizer;

// ${primary_type_name} - , Eclipse. - .

// , .

public class ${primary_type_name} implements Runnable {

StringTokenizer st; // . -

BufferedReader in ; // -

PrintWriter out ; // , .



public static void main( String [] args) {

new Thread( new ${primary_type_name}()).start(); // , .

}



public void run() {

try {

in = new BufferedReader( new FileReader( "${primary_type_name}.in" ));

out = new PrintWriter( new FileWriter( "${primary_type_name}.out" ));

solve();

} catch (Exception e) {

// - . 9000 , .

System.exit(9000);

} finally {

// .

out .flush();

out .close();

}

}

//

String nextToken() throws IOException {

while (st == null || !st.hasMoreTokens()) {

st = new StringTokenizer( in .readLine());

}

return st.nextToken();

}

// 32-

int nextInt() throws NumberFormatException, IOException {

return Integer.parseInt(nextToken());

}

//...

long nextLong() throws NumberFormatException, IOException {

return Long.parseLong(nextToken());

}

//... ?

double nextDouble() throws NumberFormatException, IOException {

return Double.parseDouble(nextToken());

}



void solve() throws NumberFormatException, IOException {

// .

}

}







いいね! これで、Javaで(おそらく最初の)オリンピアードの問題を解決する準備ができました。 シンプルですが、この特定の言語を必要とするものを選択しましょう。 この方法は、ティマスからの1196番です。 この記事に戻る前に、条件を注意深く読み、解決策について少し考えてください。 読者の間で、ある賢明な愛好家がすぐに問題を解決しようとしたとします。 次のように解決します:

int n = nextInt();

int [] teachers = new int [n];

for ( int i = 0; i < n; i ++)

teachers[i] = nextInt();

int m = nextInt();

int result = 0;

for ( int i = 0; i < m; i ++) {

int students = nextInt();

for ( int j = 0; j < n; j ++)

if (teachers[j] == students) {

result ++; break ;

}

}

out .println(result);




もちろん、彼のプログラムはO(n⋅m)で動作するため、彼はTL(制限時間を超過)を取得しました。 ところで、前のステートメントで何も言われていない場合は、 O記号について読んでおくといいでしょう。 私たちの愛好家は、よりよく考え、関連する文献を読むか、異なるサイトを見ることにし(最後の投稿を参照)、すでに問題をより早く解決する2つの方法を見つけました。 最初のものは、Javaに組み込まれたバランスの取れたバイナリツリーを使用します。

int n = nextInt();

TreeSet<Integer> teachers = new TreeSet<Integer>();

for ( int i = 0; i < n; i ++)

teachers.add(nextInt());

int m = nextInt();

int result = 0;

for ( int i = 0; i < m; i ++)

if (teachers.contains(nextInt()))

result ++;

out .println(result);






ご覧のとおり、「真正面から」解決する場合よりもさらに少ないコードが判明しました。 2番目の方法は、組み込みのクイックソートとJavaバイナリ検索を使用します。

int n = nextInt();

int [] teachers = new int [n];

for ( int i = 0; i < n; i ++)

teachers[i] = nextInt();

Arrays.sort(teachers);

int m = nextInt();

int result = 0;

for ( int i = 0; i < m; i ++) {

int students = nextInt();

int pos = Arrays.binarySearch(teachers, students);

if (pos > 0 && pos < teachers.length && teachers[pos] == students)

result ++;

}

out .println(result);




binarySearchは配列内の要素の位置、または要素が挿入されていない場合は挿入される場所のいずれかを返すため、このメソッドはもう少しボリュームがあります。 しかし、まだかなり合格です。

両方のソリューションは、明らかにO(n⋅logn+m⋅logn)= O((m + n)logn)で機能します。 明らかでない場合は、バイナリツリー、クイックソート、バイナリ検索について読む必要があります。



続く



...「プレビュー」ボタンをクリックすることにより、私は豊富なテキストにぞっとし、このトピックを2つのトピックに広げる価値があると判断しました。 そのため、C / C ++でいつどのように記述するかについてのストーリーと、典型的なタスクの分析を第2部で待ちます。



*すべてのソースコードは、 ソースコードハイライターで強調表示されました。



All Articles