SPOJ の入力スキャンの高速化
デフォルトの入出力関数 (fmt.Scan および fmt.Println) が原因で SPOJ ソリューションがタイムアウトになります。比較的遅いです。入力の読み取りを高速化するには、bufio.Scanner.Text() を使用する代わりに、bufio.Scanner を利用して標準入力から行を読み取ります。
整数変換の最適化
テキスト表現を取得し、strconv.Atoi() を使用してそれを整数に変換するには、専用の変換関数を使用して抽出します。 bufio.Scanner.Bytes() によって返された生のバイトから直接取得された数値。この方法により、不必要な文字列変換とメモリ割り当てが回避され、パフォーマンスが大幅に向上します。
func toInt(buf []byte) (n int) { for _, v := range buf { n = n*10 + int(v-'0') } return }
完全な最適化ソリューション
次の最適化されたソリューションは、入力をより高速に読み取り、SPOJ を満たします。制限時間要件:
package main import ( "bufio" "fmt" "os" ) func main() { var n, k, c int scanner := bufio.NewScanner(os.Stdin) scanner.Scan() fmt.Sscanf(scanner.Text(), "%d %d", &n, &k) for ; n > 0; n-- { scanner.Scan() if toInt(scanner.Bytes())%k == 0 { c++ } } fmt.Println(c) } func toInt(buf []byte) (n int) { for _, v := range buf { n = n*10 + int(v-'0') } return }
追加注
for scanner.Scan() { if toInt(scanner.Bytes())%k == 0 { c++ } }
以上がタイムアウトを回避するために SPOJ ソリューションを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。