藍橋杯訓練 第四天1254

2022-08-23 13:27:08 字數 1574 閱讀 2573

[藍橋杯2015初賽]手鍊樣式

小明有3顆紅珊瑚,4顆白珊瑚,5顆黃瑪瑙。

他想用它們串成一圈作為手鍊,送給女朋友。

現在小明想知道:如果考慮手鍊可以隨意轉動或翻轉,一共有多少不同的組合樣式?

輸出請你輸出該整數。不要輸出任何多餘的內容或說明性的文字。

手鍊是可以轉動翻轉

數學方法

首先要清楚這是一種環排列,並且是立體排列

用最原始的做法簡化思考,當成一行排列:

2.1 有12個珠子排列12!,但是跟相同珠子的相對位置沒有關係,所以有12!/(5!4!3!)種

考慮環排列,環排列是因為相對位置無法確定,即需要乙個參考。所以先拿乙個佔位,那麼之前總數為 12!/(5!4!3!)/12 = 2310 種

考慮翻**

4.1 翻轉必定要選乙個為軸,幹好紅色和黃色為奇數,必定要1紅1黃為軸。

4.2 只看一邊就是1紅2白2黃的排列組合,如2.1一般 5!/(1!2!2!) = 30 種

4.3 獻出開翻轉一樣的,其他組合必有一對重複的。(2310-30)/2

最終數量應該是 30 + (2310-30)/2 = 1170

有不足歡迎討論。

暴力破解法

列舉暴力在當前這個數量還不算太大,12! = 479001600 = 4.7億

轉動即是123,231,312是一種,那利用字串擴大一倍即可用尋找子串解決,即是123123中可以找到123,231,312

翻轉將2的序列逆序即可321321

說明:利用了itertools.permutations產生全排列,他是乙個生成器,每次返回的是乙個元組,product可以產生笛卡爾積

利用了functools.reduce,將返回額元組合為字串

#!/usr/bin/python3

import time

from itertools import permutations

from functools import reduce

def tuptostring(tup):

return reduce(f, tup)

start = time.time()

f = lambda a, b: a + b

chars = 'aaabbbbccccc'

sum = 0

v = #存將要尋找的

for i in permutations(chars):

sf = 0#找到了的標誌量

chars = tuptostring(i)

for com in v:

if chars in com:

sf = 1

break

if sf:

continue

chars2 = chars + chars#可以任意轉動

chars2 = chars2[::-1]#可以翻轉

sum += 1

# print(v)

print(sum)

end = time.time()

print('runtime:{}s'.format(end-start))

藍橋杯 每日一題 第四天

問題描述 給定兩個僅由大寫字母或小寫字母組成的字串 長度介於1到10之間 它們之間的關係是以下4中情況之一 1 兩個字串長度不等。比如 beijing 和 hebei 2 兩個字串不僅長度相等,而且相應位置上的字元完全一致 區分大小寫 比如 beijing 和 beijing 3 兩個字串長度相等,...

訓練總結 18 7 19 暑假訓練第四天

今天上午新開的專題做了三道題,是之前做過的題。之前把思路理清了做起來還是比較順利。下午的比賽,雖然之前有心理準備,但做起來還是怪難受的。簽個到都難,最後那道題目,一開始想著預處理一下,然後直接查詢。但是怎麼找也找不到預處理的方法,大小區間之間也沒有明確的關係。後來聽別人的思路才知道可以用樹狀陣列 離...

開課第四天

今天是開課的第四天,老師又講了很多知識 1 位運算 位運算的效能高,但是理解比較困難。1 按位與,兩個都是一才為一,兩個不一樣就為零。2 按位或,只要有乙個是一就是一。3 異或,不同為一,乙個數和另乙個數異或倆次還是它自己,乙個數和自身異或結果是零,乙個數和零異或結果還是它本身。對稱加密,解密。4 ...