前提・実現したいこと
下記コードの実行速度を上げたいです。
発生している問題
以下、3つのテストケースでTLEが発生しています。
- subtask2_02.txt
- subtask2_16.txt
- subtask2_17.txt
該当のソースコード
swift
1import Foundation 2 3func readInts() -> [Int] { 4 readLine()!.split(separator: " ").map { Int($0)! } 5} 6 7func main() { 8 let nk = readInts() 9 let (n,k) = (nk[0],nk[1]) 10 var sequence = [Int]() 11 for _ in 1...n { 12 sequence.append(Int(readLine()!)!) 13 }//______________________ここまで入力 14 15 // 0が入力されている場合、答えはnになるためnを出力して処理を終了する 16 if sequence.firstIndex(of: 0) != nil { 17 print(n) 18 return 19 } 20 var ans = 0 21 var index = 0 22 var resMultiplied = 1 23 24 for startIndex in 0..<n { 25 index = startIndex 26 while index < n && resMultiplied * sequence[index] <= k { 27 resMultiplied *= sequence[index] 28 index += 1 29 } 30 ans = max(ans, index - startIndex) 31 32 // 開始するインデックスがインデックスを超えないようにする 33 if startIndex == index { 34 index += 1 35 } 36 resMultiplied = 1 37 38 } 39 print(ans) 40 41} 42main() 43
試したこと
Swift
1// 略 2if sequence.firstIndex(of: 0) != nil { 3 print(n) 4 return 5 } 6// 略
を
Swift
1// 略 2if ss.contains(0) { 3 print(n) 4 return 5 } 6// 略
に変えて提出してみましたが同じ結果でした。
Swiftで解答された方がいらっしゃらなかったので、他言語で解答された方のコードと比較してみましたが、
アルゴリズム的に大差はないように見えました。
追記
TLE判定が出たテストケース意外では全てAC判定が出ています。
速度の前に正しいコードを考えるべきでは?
現在のコードでは「最も長いもの」を求められていないと思います。
情報が不足していたため、追記しました。
今回はたまたまAC判定が出ているが
別にテストケースを用意し実行した場合、
WA判定が出る可能性のあるコードであるということでしょうか?
https://atcoder.jp/contests/abc032/tasks/abc032_c
この問題でいいでしょうか?
入力例2で正解にならないと思います。
その問題です。URL貼るべきでした、すみません。
入力例2についてですが、
if sequence.firstIndex(of: 0) != nil {
print(n)
return
}
↑の部分で整数列に0がある場合、整数列全てをかけることができるため
「最も長いもの」であるNが出力され処理が終了するようにしています。
試しに入力例2を実行してみたところ、出力例2と同じ結果が得られました。
これは失礼しました。
var ans = 0 から上は入力処理か何かかと思って目に入ってなかったです。
申し訳ないです。
とんでもないです。
私の質問に情報が不足していたため、お手数をかけしてしまいました。
気にかけてくださりありがとうございました。
回答1件
あなたの回答
tips
プレビュー