結果
問題 |
No.910 素数部分列
|
ユーザー |
![]() |
提出日時 | 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()