結果
| 問題 |
No.910 素数部分列
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 21:27:22 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,344 bytes |
| コンパイル時間 | 174 ms |
| コンパイル使用メモリ | 81,936 KB |
| 実行使用メモリ | 90,280 KB |
| 最終ジャッジ日時 | 2025-06-12 21:28:32 |
| 合計ジャッジ時間 | 4,156 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 4 WA * 16 TLE * 1 -- * 29 |
ソースコード
def main():
import sys
n = int(sys.stdin.readline())
s = sys.stdin.readline().strip()
# 预处理所有的两位数素数,其中每个字符只能是1、3、5、7、9
two_digit_primes = [
11, 13, 17, 19,
31, 37,
53, 59,
71, 73, 79,
97
]
# 将每个素数转换为字符串,并记录所有可能的素数字符串
prime_strs = set()
for p in two_digit_primes:
prime_strs.add(str(p))
used = [False] * n # 记录字符是否已经被使用
# 首先处理长度为1的素数
count = 0
for i in range(n):
c = s[i]
if c in {'3', '5', '7'}:
used[i] = True
count += 1
# 然后处理长度为2的素数
# 我们需要找到尽可能多的互不重叠的长度为2的素数子序列
# 这里我们采用贪心策略:尽可能提前选择素数
# 将未使用的字符的位置记录下来
available = []
for i in range(n):
if not used[i]:
available.append(i)
# 现在,我们遍历available中的位置,寻找可以组成两位数的素数
# 我们需要检查每一个可能的两位数组合是否在prime_strs中
# 为了避免重复使用字符,我们记录已经使用的索引
used_available = [False] * len(available)
two_digit_count = 0
# 我们将available中的位置作为可能的起点,寻找可以组成素数的子序列
# 这里我们采用双指针的方法,尝试找到尽可能多的素数
i = 0
while i < len(available):
if used_available[i]:
i += 1
continue
# 查找j > i,使得s[available[i]] + s[available[j]] 在prime_strs中
for j in range(i+1, len(available)):
if used_available[j]:
continue
num = s[available[i]] + s[available[j]]
if num in prime_strs:
# 选中这个素数
used_available[i] = True
used_available[j] = True
two_digit_count += 1
i = j + 1
break
else:
# 没有找到可以与i组成素数的j,i前进
i += 1
total = count + two_digit_count
print(total)
if __name__ == "__main__":
main()
gew1fw