[藍橋杯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 ...