1. 問題描述:
學校的自助午餐提供圓形和方形的三明治,分別用數字 0 和 1 表示。所有學生站在乙個佇列裡,每個學生要麼喜歡圓形的要麼喜歡方形的。餐廳裡三明治的數量與學生的數量相同。所有三明治都放在乙個棧裡,每一輪:
如果佇列最前面的學生喜歡棧頂的三明治,那麼會拿走它並離開佇列。否則,這名學生會放棄這個三明治並回到佇列的尾部。
這個過程會一直持續到佇列裡所有學生都不喜歡棧頂的三明治為止。
給你兩個整數陣列 students 和 sandwiches ,其中 sandwiches[i] 是棧裡面第 i 個三明治的型別(i = 0 是棧的頂部), students[j] 是初始佇列裡第 j 名學生對三明治的喜好(j = 0 是佇列的最開始位置)。請你返回無法吃午餐的學生數量。
示例 1:
輸入:students = [1,1,0,0], sandwiches = [0,1,0,1]
輸出:0
解釋:- 最前面的學生放棄最頂上的三明治,並回到佇列的末尾,學生佇列變為 students = [1,0,0,1]。
- 最前面的學生放棄最頂上的三明治,並回到佇列的末尾,學生佇列變為 students = [0,0,1,1]。
- 最前面的學生拿走最頂上的三明治,剩餘學生隊列為 students = [0,1,1],三明治棧為 sandwiches = [1,0,1]。
- 最前面的學生放棄最頂上的三明治,並回到佇列的末尾,學生佇列變為 students = [1,1,0]。
- 最前面的學生拿走最頂上的三明治,剩餘學生隊列為 students = [1,0],三明治棧為 sandwiches = [0,1]。
- 最前面的學生放棄最頂上的三明治,並回到佇列的末尾,學生佇列變為 students = [0,1]。
- 最前面的學生拿走最頂上的三明治,剩餘學生隊列為 students = [1],三明治棧為 sandwiches = [1]。
- 最前面的學生拿走最頂上的三明治,剩餘學生隊列為 students = ,三明治棧為 sandwiches = 。
所以所有學生都有三明治吃。
示例 2:
輸入:students = [1,1,1,0,0,1], sandwiches = [1,0,0,0,1,1]
輸出:3
1 <= students.length, sandwiches.length <= 100
students.length == sandwiches.length
sandwiches[i] 要麼是 0 ,要麼是 1 。
students[i] 要麼是 0 ,要麼是 1 。
2. 思路分析:
3. **如下:
from typing import list
class solution:
def countstudents(self, students: list[int], sandwiches: list[int]) -> int:
res = 0
while len(students) > 0:
i = 0
while i < len(students) and students[0] != sandwiches[0]:
i += 1
# 將彈出元素新增到末尾
if i == len(students):
return res + len(students)
else:
# 彈出第乙個元素值
students.pop(0)
sandwiches.pop(0)
return res
poj 1700 過河問題
參考blog 上面兩篇blog都給出了該怎麼做,而且非常詳細,但是沒給出為什麼這麼做。我試著證明了一下,我感覺這個題的策略其實就是把行動最慢的兩個人送過去花費的時間最短。那麼這道題的最終結果將是最優的。因為送兩個人過河所花費的最小時間已經證明出來了。然後就以每兩個兩個的去送,那麼就形成了遞迴。但是送...
HDU1700 向量旋轉
題意 乙個圓的圓心在 0,0 已知圓上一點,求另外兩點使得這三點構成的圓內接三角形周長最大。題解 圓的內接三角形中,周長最大的為正三角形。已知一點即知道了圓的半徑,和乙個圓心與該點構成的向量,旋轉這個向量即可得到另外兩個點。include include include using namespac...
貪心 POJ 1700 過河問題
題意 n個人過河,船每次只能坐兩個人,船載每個人過河的所需時間不同,過河時間以耗時間長的那個為實際耗時,如何得出最快的過河時間。思路 1 每次最快和那些慢的過去,然後讓最快一直來回,最後全部到對岸。2 還有一種情況,你先讓兩個快的人從a過去至b,然後挑乙個人回來至a,留下乙個快的在b。ok,回來以後...