ブルーブリッジカップ公式ウェブサイトの質問記録 Python

ブルーブリッジカップ公式ウェブサイトの質問記録 Python

2020年、2021年、2022年の地方大会でも多くの問題が出題されるため、一部は前回の記事で取り上げたのでここでは触れません。

1. スペース

Xiaolan は、配列を開くために 256MB のメモリ スペースを使用する予定です。配列の各要素は 32 ビットの 2 進整数です。プログラムが占有するスペースとメモリのメンテナンスに必要な補助スペースを考慮しない場合、32 ビットはいくつ必要になりますか2 進整数は 256MB のスペースに保存できますか? 整数?
OS
をインポート SYSをインポート

# 请在此输入您的代码
## 32位占32bit
## 1MB = 1024KB
## 1KB = 1024byte
## 1byte = 8bits
print(256*1024*1024*8//32)

2. 増加シーケンス

文字の行列の場合、行列内で左から右に見て同じ行、同じ列、または同じ 45 度の対角線上にある 2 つの文字を見つけたとき、行列内の増加シーケンスと呼びます。上から下に向かって増加します。
たとえば、次の行列の
LANN
QIAOには、 LN、LN、AN、AN、IO、AO、LQ、AI、NO、NO、AQ、IN、AN などの 13 個の増加シーケンス
があります。2つの文字が左下から右上に並んでいる場合、左から右に見た場合と上から下に見た場合では順序が異なることに注意してください。次の 30 行 50 列の行列には、合計で何個の増加シーケンスがありますか?


VLPWJVVNNZSWFGHSFRBCOIJTPYNEURPIGKQGPSXUGNELGRVZAG
SDLLOVGRTWEYZKKXNKIRWGZWXWRHKXFASATDWZAPZRNHTNNGQF
ZGUGXVQDQAEAHOQEADMWWXFBXECKAVIGPTKTTQFWSWPKRPSMGA
BDGMGYHAOPPRRHKYZCMFZEDELCALTBSWNTAODXYVHQNDASUFRL
YVYWQZUTEPFSFXLTZBMBQETXGXFUEBHGMJKBPNIHMYOELYZIKH
ZYZHSLTCGNANNXTUJGBYKUOJMGOGRDPKEUGVHNZJZHDUNRERBU
XFPTZKTPVQPJEMBHNTUBSMIYEGXNWQSBZMHMDRZZMJPZQTCWLR
ZNXOKBITTPSHEXWHZXFLWEMPZTBVNKNYSHCIQRIKQHFRAYWOPG
MHJKFYYBQSDPOVJICWWGGCOZSBGLSOXOFDAADZYEOBKDDTMQPA
VIDPIGELBYMEVQLASLQRUKMXSEWGHRSFVXOMHSJWWXHIBCGVIF
GWRFRFLHAMYWYZOIQODBIHHRIIMWJWJGYPFAHZZWJKRGOISUJC
EKQKKPNEYCBWOQHTYFHHQZRLFNDOVXTWASSQWXKBIVTKTUIASK
PEKNJFIVBKOZUEPPHIWLUBFUDWPIDRJKAZVJKPBRHCRMGNMFWW
CGZAXHXPDELTACGUWBXWNNZNDQYYCIQRJCULIEBQBLLMJEUSZP
RWHHQMBIJWTQPUFNAESPZHAQARNIDUCRYQAZMNVRVZUJOZUDGS
PFGAYBDEECHUXFUZIKAXYDFWJNSAOPJYWUIEJSCORRBVQHCHMR
JNVIPVEMQSHCCAXMWEFSYIGFPIXNIDXOTXTNBCHSHUZGKXFECL
YZBAIIOTWLREPZISBGJLQDALKZUKEQMKLDIPXJEPENEIPWFDLP
HBQKWJFLSEXVILKYPNSWUZLDCRTAYUUPEITQJEITZRQMMAQNLN
DQDJGOWMBFKAIGWEAJOISPFPLULIWVVALLIIHBGEZLGRHRCKGF
LXYPCVPNUKSWCCGXEYTEBAWRLWDWNHHNNNWQNIIBUCGUJYMRYW
CZDKISKUSBPFHVGSAVJBDMNPSDKFRXVVPLVAQUGVUJEXSZFGFQ
IYIJGISUANRAXTGQLAVFMQTICKQAHLEBGHAVOVVPEXIMLFWIYI
ZIIFSOPCMAWCBPKWZBUQPQLGSNIBFADUUJJHPAIUVVNWNWKDZB
HGTEEIISFGIUEUOWXVTPJDVACYQYFQUCXOXOSSMXLZDQESHXKP
FEBZHJAGIFGXSMRDKGONGELOALLSYDVILRWAPXXBPOOSWZNEAS
VJGMAOFLGYIFLJTEKDNIWHJAABCASFMAKIENSYIZZSLRSUIPCJ
BMQGMPDRCPGWKTPLOTAINXZAAJWCPUJHPOUYWNWHZAKCDMZDSR
RRARTVHZYYCEDXJQNQAINQVDJCZCZLCQWQQIKUYMYMOVMNCBVY
ABTCRRUXVGYLZILFLOFYVWFFBZNFWDZOADRDCLIRFKBFBHMAXX

まず、それぞれの点について、他の点がその右、下、斜めにある場合にのみ、答えが +1 されます。斜めの場合は、左上にあることはできません。つまり、その点を使用して描画する場合です。軸を中心にすると、第 4 象限は機能しません。なぜなら、対角線 y = -x の場合、右に行くことと下に行くことは同じ方向であるため、第 4 象限は機能せず、対角線 y = x の場合、右に行くことと下に行くことはしたがって、第 1.3 象限と第 3 象限は両方とも OK であるため、第 1 象限だけが問題となります。

次に、すべてのポイントを 1 回通過するだけで済み、もう一度すべてのポイントを通過する必要があります。要件が満たされると、答えは +1 になります。 50 30 50*30 時間計算量はそれほど高くありませ

OS
をインポート SYSをインポート

ここにコードを入力してください

data = ["VLPWJVVNNZSWFGHSFRBCOIJTPYNEURPIGKQGPSXUGNELGRVZAG",\
"SDLLOVGRTWEYZKKXNKIRWGZWXWRHKXFASATDWZAPZRNHTNNGQF",\
"ZGUGXVQDQAEAHOQEADMWWXFBXECKAVIGPTKTTQFWSWPKRPSMGA",\
"BDGMGYHAOPPRRHKYZCMFZEDELCALTBSWNTAODXYVHQNDASUFRL",\
"YVYWQZUTEPFSFXLTZBMBQETXGXFUEBHGMJKBPNIHMYOELYZIKH",\
"ZYZHSLTCGNANNXTUJGBYKUOJMGOGRDPKEUGVHNZJZHDUNRERBU",\
"XFPTZKTPVQPJEMBHNTUBSMIYEGXNWQSBZMHMDRZZMJPZQTCWLR",\
"ZNXOKBITTPSHEXWHZXFLWEMPZTBVNKNYSHCIQRIKQHFRAYWOPG",\
"MHJKFYYBQSDPOVJICWWGGCOZSBGLSOXOFDAADZYEOBKDDTMQPA",\
"VIDPIGELBYMEVQLASLQRUKMXSEWGHRSFVXOMHSJWWXHIBCGVIF",\
"GWRFRFLHAMYWYZOIQODBIHHRIIMWJWJGYPFAHZZWJKRGOISUJC",\
"EKQKKPNEYCBWOQHTYFHHQZRLFNDOVXTWASSQWXKBIVTKTUIASK",\
"PEKNJFIVBKOZUEPPHIWLUBFUDWPIDRJKAZVJKPBRHCRMGNMFWW",\
"CGZAXHXPDELTACGUWBXWNNZNDQYYCIQRJCULIEBQBLLMJEUSZP",\
"RWHHQMBIJWTQPUFNAESPZHAQARNIDUCRYQAZMNVRVZUJOZUDGS",\
"PFGAYBDEECHUXFUZIKAXYDFWJNSAOPJYWUIEJSCORRBVQHCHMR",\
"JNVIPVEMQSHCCAXMWEFSYIGFPIXNIDXOTXTNBCHSHUZGKXFECL",\
"YZBAIIOTWLREPZISBGJLQDALKZUKEQMKLDIPXJEPENEIPWFDLP",\
"HBQKWJFLSEXVILKYPNSWUZLDCRTAYUUPEITQJEITZRQMMAQNLN",\
"DQDJGOWMBFKAIGWEAJOISPFPLULIWVVALLIIHBGEZLGRHRCKGF",\
"LXYPCVPNUKSWCCGXEYTEBAWRLWDWNHHNNNWQNIIBUCGUJYMRYW",\
"CZDKISKUSBPFHVGSAVJBDMNPSDKFRXVVPLVAQUGVUJEXSZFGFQ",\
"IYIJGISUANRAXTGQLAVFMQTICKQAHLEBGHAVOVVPEXIMLFWIYI",\
"ZIIFSOPCMAWCBPKWZBUQPQLGSNIBFADUUJJHPAIUVVNWNWKDZB",\
"HGTEEIISFGIUEUOWXVTPJDVACYQYFQUCXOXOSSMXLZDQESHXKP",\
"FEBZHJAGIFGXSMRDKGONGELOALLSYDVILRWAPXXBPOOSWZNEAS",\
"VJGMAOFLGYIFLJTEKDNIWHJAABCASFMAKIENSYIZZSLRSUIPCJ",\
"BMQGMPDRCPGWKTPLOTAINXZAAJWCPUJHPOUYWNWHZAKCDMZDSR",\
"RRARTVHZYYCEDXJQNQAINQVDJCZCZLCQWQQIKUYMYMOVMNCBVY",\
"ABTCRRUXVGYLZILFLOFYVWFFBZNFWDZOADRDCLIRFKBFBHMAXX"]

ans = 0
for i in range(30):
    for j in range(50):
        for k in range(30):
            for l in range(50):
                if data[i][j] < data[k][l] and ((i == k and l > j) or (j == l and k > i) or (abs(i-k) == abs(j-l) and not (k <= i and l <= j))):
                    ans += 1
print(ans)

3. 算術素数列

2,3,5,7,11,13,... は素数の列です。類似: 7,37,67,97,127,157。
7,37,67,97,127,157 このようにすべて素数から構成される算術列を算術素数列といいます。
上記のシーケンスの許容値は 30、長さは 6 です。
2004 年、グリーンは中国人のテレンス・タオと共同で、任意の長さの素数の算術数列が存在することを証明しました。これは数論の分野では驚くべき結果です。
この理論に基づいて、手元のコンピューターを使用して自信を持って検索してください。
長さ 10 の算術素数列の最小許容誤差はいくらですか?

この質問は穴埋め問題であり、計算できる限り、時間の複雑さは誇張すべきではありません。許容範囲を小さいものから大きいものまでたどっていくという考え方です。次に、すべての素数を反復処理します。素数と許容値はそれほど大きくないと思うので、範囲は 2 から 1000 です。見つからない場合は拡張できます。コードを見るとわかりやすい

import os
import sys
import math
### 反正是填空题,能算出来就行
# 请在此输入您的代码
def check(n):
  for i in range(2,int(math.sqrt(n)) + 1):
    if n % i == 0: return False 
  return True
find = False
for d in range(2,1000): # 公差
  if find : break
  for i in range(2,1000): # 素数
    if find: break
    n = i
    res = 0
    while check(n):
      res += 1
      n += d
    if res == 10:
      print(d)
      find = True

4. チームを結成する

バスケットボール チームのコーチとして、あなたは次のリストのポジション 1 ~ 5 から 1 人の選手を選択して、チームのスターティング ラインナップを形成する必要があります。ポジション 1 ~ 5 をプレーしたときの各プレーヤーのレーティングは次の表に示されています。スタメンの 1 位から 5 位までの評価の合計の最大値を計算してください。
ここに画像の説明を挿入します

この問題は、Lingo を使用すれば簡単に解決できます。笑、線形計画法ですが、Python ですべての可能性を調べても解決できます。モンテカルロを使用して最適値を見つけることもできるとさえ思いますが、ここに教訓がありますタイムアウトにならない方法です 結局、昨年は穴埋め問題が2問しかなかったので、まだまだ手続き問題を練習する必要があります。

これを行うには動的プログラミングを使用します。f[i][j] は、最初の j 位に参加した最初の i 人の生徒の最大スコアを表します。w[i][j] は、j 番目のポジションの i 番目の生徒のスコアを表します。i 番目の生徒がどのポジションにも参加していない場合、 f[i][j] = f[i-1 ][j]、i 番目の生徒が j 番目のポジションに参加したい場合、f[i][j] = f[i-1][j-1] + w[i][j]。

追伸:よく考えてみたらやり方が間違っていたのですが、たまたまこの問題はクリアすることができました。なぜなら、20 人目の人が最初の 4 つのポジションを選択した場合、この問題を解決する方法はありません。したがって、空白を埋めるときは、総当たり法またはモンテカルロ法を使用する方が良いかもしれません。

import os
import sys

# 请在此输入您的代码
w = [[0]*30 for _ in range(30)]
f = [[0]* 30 for _ in range(30)]
# f[i][j] 表示前i个学生参加j个位置
w[1][1] = 97;
w[1][2] = 90;
w[2][1] = 92;
w[2][2] = 85;
w[2][3] = 96;
w[3][5] = 93;
w[4][4] = 80;
w[4][5] = 86;
w[5][1] = 89;
w[5][2] = 83;
w[5][3] = 97;
w[6][1] = 82;
w[6][2] = 86;
w[7][4] = 87;
w[7][5] = 90;
w[8][2] = 97;
w[8][3] = 96;
w[9][3] = 89;
w[10][1] = 95;
w[10][2] = 99;
w[11][3] = 96;
w[11][4] = 97;
w[12][4] = 93;
w[12][5] = 98;
w[13][1] = 94;
w[13][2] = 91;
w[14][2] = 83;
w[14][3] = 87;
w[15][3] = 98;
w[15][4] = 97;
w[15][5] = 98;
w[16][4] = 93;
w[16][5] = 86;
w[17][1] = 98;
w[17][2] = 83;
w[17][3] = 99;
w[17][4] = 98;
w[17][5] = 81;
w[18][1] = 93;
w[18][2] = 87;
w[18][3] = 92;
w[18][4] = 96;
w[18][5] = 98;
w[19][4] = 89;
w[19][5] = 92;
w[20][2] = 99;
w[20][3] = 96;
w[20][4] = 95;
w[20][5] = 81;
for i in range(1,21):
  for j in range(6):
      f[i][j] = f[i-1][j]
      if j >= 1:
        f[i][j] = max(f[i][j],f[i-1][j-1] + w[i][j])
print(f[20][5])

以下は強引な方法ですが、悪くはなく、時間の計算量もそれほど高くありません。

import os
import sys

# 请在此输入您的代码
w = [[0]*30 for _ in range(30)]
f = [[0]* 30 for _ in range(30)]
w[1][1] = 97;
w[1][2] = 90;
w[2][1] = 92;
w[2][2] = 85;
w[2][3] = 96;
w[3][5] = 93;
w[4][4] = 80;
w[4][5] = 86;
w[5][1] = 89;
w[5][2] = 83;
w[5][3] = 97;
w[6][1] = 82;
w[6][2] = 86;
w[7][4] = 87;
w[7][5] = 90;
w[8][2] = 97;
w[8][3] = 96;
w[9][3] = 89;
w[10][1] = 95;
w[10][2] = 99;
w[11][3] = 96;
w[11][4] = 97;
w[12][4] = 93;
w[12][5] = 98;
w[13][1] = 94;
w[13][2] = 91;
w[14][2] = 83;
w[14][3] = 87;
w[15][3] = 98;
w[15][4] = 97;
w[15][5] = 98;
w[16][4] = 93;
w[16][5] = 86;
w[17][1] = 98;
w[17][2] = 83;
w[17][3] = 99;
w[17][4] = 98;
w[17][5] = 81;
w[18][1] = 93;
w[18][2] = 87;
w[18][3] = 92;
w[18][4] = 96;
w[18][5] = 98;
w[19][4] = 89;
w[19][5] = 92;
w[20][2] = 99;
w[20][3] = 96;
w[20][4] = 95;
w[20][5] = 81;
score = [0]*5
res = 0
for i in range(1,21):
    for j in range(1,21):
        for k in range(1,21):
            for l in range(1,21):
                for h in range(1,21):
                    if i != j and i != k and i != l and i != h and j != k and j != l and j != h and k != l and k != h and l != h :
                        for o in range(1,6): # 打第几个位置
                            score[0],score[1],score[2],score[3],score[4] = w[i][o],w[j][(o+1)%5],w[k][(o+2)%5],w[l][(o+3)%5],w[h][(o+4)%5]
                            res = max(res,sum(score))
print(res)

5. 7セグメントコード

Xiaolan は、7 セグメントのデジタル チューブを使用して特別なキャラクターを表現したいと考えています。
ここに画像の説明を挿入します

ここに画像の説明を挿入します

これには、Python のいくつかの基本ライブラリを使用する必要があります。

itertools.combiations('abcdefg',3) は、7 文字 abcdefg を使用してそのうち 3 つを取り出すことができ、3 つすべての組み合わせ (順序は考慮されません) itertools.permutations('abc') は、次のすべてのシーケンスを取り出すことができます
。 abc の組み合わせから出力
次に、必要なのはすべての組み合わせと順序を調べて、それらを接続できるかどうかを確認することだけです。

なぜ順序をたどる必要があるのでしょうか? abcd aとcがつながっていて、cがbとつながっている可能性があるので、このように判断すると、aとbがつながっていないのでつながっていないと判断しますが、実際はつながっています。したがって、acbd にトラバースしたい場合は、そのとおりであり、ループから抜け出すだけです。

import os
import sys
import itertools
# 请在此输入您的代码
W = {"a": ["b", "f"],
     "b": ["a", "g", "c"],
     "c": ["b", "d", "g"],
     "d": ["c", "e"],
     "e": ["d", "f", "g"],
     "f": ["a", "e", "g"],
     "g": ["b", "c", "e", "f"]
     }  # 字典,存放距离为1的字符,用来判别
s1 = []
count = 0
for i in range(1,8):
  a = list(itertools.combinations('abcdefg',i))
  for j in a:
    s1.append(''.join(j))  # 元组转化为字符串存入列表中
for i in s1:
  a = itertools.permutations(i)
  for j in a:
    for k in range(len(j) - 1):
      if j[k+1] not in W[j[k]]:break
    else:
      count += 1
      break
print(count)

6. 換算された分数

ここに画像の説明を挿入します

「トラバーサルです。言うことはあまりありませんが、ブルーブリッジカップの公式ウェブサイトで直接実行するとタイムアウトになります。競技中に独自の穴埋め問題を使用すると、勝ちます。」タイムアウトになるかどうかは気にしません。

import os
import sys

# 请在此输入您的代码
# def gcd(a,b):
#   if b == 0: return a
#   else: return gcd(b,a%b)
# res = 0
# for i in range(1,2021): # 分母
#   for j in range(1,2021):
#     if gcd(i,j) == 1: res += 1
# print(res)

print(2481215)

7. ジャンプ

ここに画像の説明を挿入します
ここに画像の説明を挿入します

この質問は、何も考えずに dp を使用して実行できることがわかっています。つまり、このステップの最大値は、前のステップの最大値にこのステップの重みを加えたものに等しいということです。

OS
をインポート SYSをインポート

# 请在此输入您的代码
n,m = map(int,input().split())
map1 = []
for i in range(n):
  a = [int(x) for x in input().split()]
  map1.append(a)
dp = [[-200]*(m+3) for _ in range(n+3)] # 多出来三个为了防止最开始的时候会溢出
for i in range (3,n+3):
  for j in range(3,m+3):
    if i == 3 and j == 3 :
      dp[i][j] = map1[i-3][j-3]
    else:
      dp[i][j] = map1[i-3][j-3] + max(dp[i][j-1],dp[i][j-2],dp[i][j-3],dp[i-1][j],dp[i-1][j-1],dp[i-1][j-2],dp[i-2][j],dp[i-2][j-1],dp[i-3][j])
print(dp[n+2][m+2])

8. シーケンスの評価

ここに画像の説明を挿入します

この質問では最後の 4 桁が必要ですが、最初の桁がどのように変化するかは次の 4 桁には影響しないため、考慮する必要はありません。一つずつ助けを求めてください。私の i は 20190318 です。最初の 3 つの 1 はもう必要ないので、20190324 より 6 桁少ないです。すると、a、b、c は 4、5、6 桁になります。初めてのことで、助けを求めます。は 7 番目です。

a,b,c = 3,5,9 
res = 0
for _ in range(20190318):
  res = (a + b + c) % 10000
  a,b,c = b,c,res
print(res)

継続的に更新中...

おすすめ

転載: blog.csdn.net/abc1234564546/article/details/128907797