1

私は Java を使用して SPOJ ( http://www.spoj.pl ) の問題を解決していますが、それらの多くは明らかにコンソール入力を使用しています。問題は、何行の入力があるかを言わない人もいるので、何もなくなったらプログラムを閉じるのは私次第です。私はスキャナーを使用しています:

Scanner s = new Scanner(System.in);
String str = s.nextLine();

残念ながら、次の行は読み取れませんが... ユーザーの入力を待ってから、次の行を取得します。これは、

s.hasNext();

そのため、いつプログラムを終了するかわかりません。それを待たずに入力行を読む方法はありますか?

4

4 に答える 4

1

彼らが入力の仕様を与えることは、競技プログラミングの問題のほとんどの標準です(私はあなたが知っていると確信しています). 私はウェブサイト上のいくつかの問題に目を通しましたが、それらはすべて指定されていました. 完全な仕様がない問題へのリンクはありますか?

その場合は、管理者にメールして仕様を更新してもらうと便利です。それに加えて、Scanner.hasNextLine()入力の最後に達した場合は false を返す必要があります。

更新入力はファイルからパイプされているため、hasNextLine()必要に応じて機能するはずです。これまでのところうまくいきませんでしたか?他の方法でコードに時間がかかりすぎていませんか?

于 2012-10-10T08:36:10.170 に答える
0

あなたはこれについて間違っています。入力がなくなるまで読み取りを続行する必要があります。入力の最後は null として定義されます。タイムアウトの待機に時間がかかると、コードが spoj テストに失敗する原因になります。spoj は速度に関して非常に厳格です。

私があなたに次の問題を与えるとしましょう:

整数のリストが与えられ、それぞれが独自の行にあり、すべての整数の合計を出力します。

1
2
3
4
5

さらに入力が来るかどうか、いつ来るかはわかりません。重要なのは、そこに座って数字を入力する人がいないことです。入力はファイルから直接プログラムにパイプされ、null で終了します (ファイルがそうする傾向があるため)。

spoj で機能するのは次のとおりです。

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String line = "";
    int sum = 0;
    while ((line = br.readLine()) != null) {
        sum += Integer.parseInt(line);
    }
    System.out.println(sum);

私が見逃している奇妙なspojケースがある場合は、spojの問題でこれにコメントしてください.入力を読み取る方法を教えてください. 間違いなく、タイマーやスレッド、またはばかげたものではありません。

于 2012-10-10T08:38:32.303 に答える
0

解決策を見つけるためにスマートなアルゴリズムを使用していない場合、一部の問題は時間がかかりすぎるように設計されています。次のことをお勧めします。

  • まず、入力がどのように与えられるかを正確に知るために
  • 次に、(およびその他のエラー コード) の意味を正確に理解します。NZEC彼らはフォーラムを持っています
  • この時点で、実行中にプログラムがまだ強制終了されている場合は、時間のかかるより良いアルゴリズムを見つける必要があることを意味します。

私がお勧めするのは、作業を行う関数のパラメーターとして入力ストリームを渡し、プログラムのオプションのパラメーターとしてファイルを与えることです。いくつかのファイル入力を作成し、ファイル入力ストリームでコードをテストして、プログラムの実行時間に影響を与えるものを検出してみてください。

于 2012-10-10T09:04:30.477 に答える
-1

タイマー変数を作成する

Scanner s = new Scanner(System.in);
// Start timer here
String str = s.nextLine();
//If a next line is read, reset timer.

タイマーにイベントを追加して、タイマーが期限切れになった場合にプログラムが終了するようにします。

于 2012-10-10T08:13:44.560 に答える