昨日、Meituanの一連の質問を行い、質問を記録しました。共有して、自分のアイデアやプロセスを書き留めてください。もちろん間違いがあるはずです。間違いがあれば、私に直接コメントしてください。または、ご自身のアイデアがある場合は、それを私と共有してそこから学んでいただければ幸いです。
問題 1: ハミング距離の合計
Xiaomeiには01串が2本ありますs, t
。彼女は∣ s ∣ |s|s
と等しいt
すべての長さを見つけたいと考えています。∣ s ∣部分文字列 (連続) のハミング距離の合計。つまり、彼女はハミング距離Ham ( ti , s ) \text{Ham}(t_i , s) をハム( t私は、s),其中 t i t_i t私は 指第 i i i文字から始まる長さは∣ s ∣ |s|∣ s ∣部分文字列。等しい長さの 01 文字列の場合a, b
、それらの間のハミング距離の定義は次のとおりです。
Ham ( a , b ) = ∑ i = 1 ∣ a ∣ ∣ ai − bi ∣ \text{Ham}(a, b) = \sum_{ i =1}^{|a|}|a_i-b_i|ハム(_ _b )=i = 1∑∣ ∣ _∣ a私は−b私は∣
2 つの整数間のハミング距離は、 2 つの数値の対応する 2 進ビットが異なる位置の数を指します。
入力: データの各セットには 2 行のデータが含まれており、最初の行はs
、2 行目はt
; 1 ≤ ∣ s ∣ ≤ ∣ t ∣ ≤ 50000 1\le|s|\le|t|\le500001≤∣ s ∣≤∣ t ∣≤5 0 0 0 0。
出力: ハミング距離の合計を表す整数を出力します。
样例输入:
01
00111
样例输出:
3
私自身の考え:ハッシュテーブル
- まず、長さ のスライディング ウィンドウを使用して
s
文字列全体を走査しますt
。 - ハッシュ テーブルを使用します。キーはスライディング ウィンドウ内の部分文字列、値は部分文字列が に出現する回数で、 tt
t
全体を走査します。t文字列; - ハッシュ テーブル内の各キー
s
間のハミング距離と出現回数を計算し、それらを合計して結果を取得します。
def distance(t, s): # 汉明距离
n = len(s)
ans = 0
for i in range(n):
if t[i] != s[i]:
ans += 1
return ans
while True:
try:
s = input()
t = input()
ns, nt = len(s), len(t) # 获得两个字符串的长度
cntHash = dict() # 记录不同类型子串的数量的哈希表
l, r = 0, ns # 滑动窗口去记录所有的子串数量
while r <= nt:
subStr = t[l:r] # 获得当前子串
if subStr not in cntHash:
cntHash[subStr] = 1
else: # 如果子串在 哈希表 中
cntHash[subStr] += 1
l += 1 # 窗口往后移一格
r += 1
distSum = 0 # 汉明距离的和
# 计算子串之间汉明距离之和
for ti in cntHash.keys():
distSum += cntHash[ti] * distance(ti, s)
print(distSum)
except: break
質問 2: ダイヤモンド ダイアグラム
ひし形は、対辺が対称で、4つの辺の長さが等しい、とても優雅な図形です。たとえば、正方形は特別な種類の菱形です。グラフ理論の場合、ダイヤモンド グラフは、点の数が 4 以上であることを満たし、その中で 4 つの異なる点が見つかり、 、 、 、 のa,b,c,d
距離a => b
はb => c
すべてc => d
等しいd => a
。
Xiaomei はグラフ理論の学習を終えたところです。彼女は何気なく、n
点m
と無向エッジを含むグラフ (複数のエッジや自己ループがなく、接続性が保証されている、つまり、任意の 2 つの点が相互に到達可能) を作成しました。そして、このグラフがひし形グラフであるかどうかを知りたいと考えました。(デフォルトの 2 点間の距離は 1 です)
入力: 最初の行の正の整数T
。データのグループがあることを示しますT
。
データの各セットについて、最初の行の 2 つの正の整数は、n, m
無向グラフの点とエッジの数を表します。
2 行目m
は正の整数u_i
、3 行目m
は正の整数でv_i
、と の間に無向エッジがあることを示しますu_i
。v_i
データには複数のエッジや自己ループがないことが保証されており、グラフは接続されています。数字はスペースで区切られます。
4 ≤ n ≤ m ≤ 1 0 4,1 ≤ ui ,vi ≤ n,1 ≤ T ≤ 8 4\le n\le m\le 10^4,1\le u_i,vi\le n,1\le T \84≤n≤メートル≤1 04、1 __≤あなた私は、v私≤n ,1≤T≤8
出力: データのセットごとに、ダイヤモンド グラフの場合は行を出力しYes
、それ以外の場合は行を出力しますNo
。
样例输入:
3
8 8
1 3 7 8 5 6 2 4
3 7 8 5 6 2 4 1
9 9
1 3 7 8 5 6 2 4 3
3 7 8 5 6 2 4 1 9
7 7
1 5 6 7 3 4 2
5 6 7 3 4 2 1
样例输出:
Yes
No
No
この質問は行われていませんでした。
質問3: 米倉庫
シャオメイの故郷は豪雨に見舞われた。この目的のために、彼女は救援米倉庫を設立しました。お米の搬入・搬出はワゴン車が行っております。今はキャラバン隊があり、各車は一定量の米を持って行ったり持って行ったりしなければなりません。最初にシャオメイの倉庫にMキログラムの米があると仮定すると、ある車が通り過ぎると倉庫が開き、この車とその後ろの車両が倉庫に入って米を輸送したり持ち去ったりできるようになります。車が希望の米を入手できなかった場合、シャオメイは事前に倉庫を閉め、この車とその後ろの車は倉庫に入ることができなくなります。(つまり、Xiaomei の倉庫は艦隊の連続した部分文字列に対して開放され、倉庫内の米はマイナスにはなりません)
Xiaomeiの倉庫には最大何台の車が入ることができるかお聞きしてもいいでしょうか。
入力: データの各セットには 2 行のデータが含まれています。最初の行は車両の車両数n
と小梅の倉庫がもともと持っている米m
、2 行目はチームが持ち去りたい量です (負の値)または納品(正の値) 米ai a_iある私は, 数字はスペースで区切られます。
1 ≤ n ≤ 50000 、− 1 0 9 ≤ ai ≤ 1 0 9 、0 ≤ m ≤ 1 0 9 1\and n \and 50000, -10^9\and a_i\and10^9,0\and m\le 10^91≤n≤5 0 0 0 0 、−1 09≤ある私は≤1 09、0 __≤メートル≤1 09
出力: 最大で何台の車両が進入するかを示す整数を出力します (最長の連続部分文字列)。
样例输入:
4 10
-16 2 -6 8
样例输出:
3
私の思考回路:
- 2 つの変数を使用して車両の入庫を 1 台ずつシミュレートし、
rest
現在の倉庫の残りを記録 (初期値m
)、maxCar
現在倉庫に入っている車両を記録、配列を先頭から走査するa
と、次の 3 つの状況が発生します。次の車両が入ります。- 倉庫の余剰はまだマイナスではありません。つまり
rest + a[i] >= 0
、 しましょうmaxCar := maxCar + 1
。 - 現在の倉庫が次の車両が受け取るのに十分でない場合、つまり、
rest + a[i] < 0
現在位置の前の車両が入庫できない場合、この時点で 2 つの状況が考えられます。- 現在倉庫に入ろうとしている車が取りたい米の量が倉庫の初期量以下である場合、つまり、この
m + a[i] >= 0
車は倉庫に入ることができ、注文しますrest = m + a[i]
。maxCar = 1
- そうでない場合、この車が取りに来ようとしている米の量が倉庫の初期量よりも多い場合、つまり、
m + a[i] < 0
車が入ってきて、この車を飛ばしてrest = m, maxCar = 0
最初から始めることはできません。
- 現在倉庫に入ろうとしている車が取りたい米の量が倉庫の初期量以下である場合、つまり、この
- 倉庫の余剰はまだマイナスではありません。つまり
while True:
try:
n, m = map(int, input().split()) # 第一行:车队数量,仓库大米存量
a = list(map(int, input().split())) # 车队预计要运输的大米
n = len(a)
maxCar = 0 #
rest = m
for i in range(n):
rest += a[i]
if rest >= 0:
maxCar += 1
elif m + a[i] >= 0:
rest = m + a[i]
maxCar = 1
else:
rest = m
maxCar = 0
print(maxCar)
except: break
質問 4: ジュースを買う
シャオメイのクラスはクラスパーティーを企画しています!先生はシャオメイに、パーティー用のジュースを買うという課題を与えました。
シャオメイはスーパーマーケットに来て、スーパーにはさまざまなジュース飲料がありn
、その種類は1 、 2 、 3 、 … 、 n 1、2、3、\dots、n とマークされていることに気付きました。1 、2 、3 、…、n、それぞれの飲み物には珍味がありますai a_iある私はあいあい_ある私は大きいほど飲みやすくなります。ただし、果汁飲料によっては味が変な場合がありますので、ai a_iある私は0 以下の場合もあります。
シャオメイさんは各生徒の好みが分からなかったので、それぞれの飲み物をボトルで購入しました。この時、シャオメイは次のように考えていました: 1 ≤ l ≤ r ≤ n 1\le l\le r \le nをl, r
満たすようなペアを見つけることができますか1≤私≤r≤n 、および[ l , r ] = [ 1 , n ] [l,r]=[1,n] を満たさない[ l 、r ]=[ 1 、n ] (つまり、すべてを選択)、 [ l , r ] [l,r]のようになります。[ l 、r ]このカテゴリの各飲み物のボトルを購入すると、その美味しさの合計は、各飲み物のボトルを購入した場合の美味しさの合計以上になりますか?
入力: 最初の行の正の整数T
。データのグループがあることを示しますT
。
データの各セットについて、最初の行は正の整数n
、2 行目n
は整数a 1 、 a 2 、…、 a_1、a_2、\dots 、a_nです。ある1、ある2、…、あるん。
1 ≤ T ≤ 5 、 3 ≤ n ≤ 5 × 1 0 4 、 − 100 ≤ ai ≤ 100 1\and T\and 5, 3\and n\and 5\times 10^4, -100\and a_i\and 1001≤T≤5 、3≤n≤5×1 04、− 1 0 0≤ある私は≤1 0 0
出力: データのセットごとに、見つかった場合は出力、Yes
それ以外の場合は出力No
。
样例
2
4
1 2 3 4
3
-5 5 -5
答案
No
Yes
私の思考回路:
a
左から右に蓄積し、右から左に蓄積します- そうすると、マイナスか0がある限り、タイトルに記載されているような買い方があるということになります。
T = int(input()) # 有 T 组数据
for _ in range(T):
n = int(input())
a = list(map(int, input().split()))
s = 0
res = "No"
for i in range(n):
s += a[i]
if s <= 0:
res = "Yes"
break
s = 0
if res == "No":
for i in range(n-1, -1, -1):
s += a[i]
if s <= 0:
res = "Yes"
break
print(res)