前段時間看到了同學**的中興通訊的比賽鏈結,之前也沒有參加過演算法類的比賽,這次打算報著試一試的態度參加下,增加下經驗。在初步看了幾個門派的題目簡介後,發現只有傅利葉派比較適合自己,所以最終選擇了傅利葉派。@目錄
在某片遙遠的大陸上,居住著兩個世代友好的部落,分別是部落a和部落b。他們一起耕耘勞作,互相幫助,親如一家。久而久之,部落裡的每個人都在對方部落裡找到了志趣相投,互相欣賞的好朋友。有的人性格熱情開朗,好朋友很多;有的人性格沉穩內斂,好朋友相對少一些。
每到秋天豐收的季節,這兩個部落的人民都會聚集在一起舉行盛大的「豐收祭」,來祈禱下一年的風調雨順。今年的豐收祭馬上又要舉行了。為了進一步增進兩個部落的友誼,也為了明年能有乙個好收成,這兩個部落的祭司們商量後決定:在今年的豐收祭前舉辦一場特別的「擊鼓傳花」遊戲。只不過遊戲中並非有人真的擊鼓,並且所傳遞的「花」也不是真的花,而是等待在豐收祭上獻上的祭品。
遊戲規則如下:
1. 兩個部落的所有人都可以事先準備自己的祭品,且每個人的祭品樣式都不同,每乙個祭品都分別盛放在乙個相對應的木托盤裡;準備此祭品的人熟悉自己的祭品;
2. 每個人可以準備的祭品數量不限;祭品的最小不可分割單位是1份;
3. 遊戲開始後,在整個遊戲過程中,每個人都能且只能將祭品(包括木托盤)傳遞給自己在對方部落裡的好朋友們,每個好友可以接收的祭品數量不限;
4. 收到祭品的人必須在盛放此祭品的木托盤上刻上自己的名字(代表留下自己美好的祝願),隨後按按照上一條規則,繼續傳遞;
5. 如果祭品回到最初準備此祭品的人手中,此人也在木托盤上刻上自己的名字之後,終止傳遞;
6. 木托盤上不允許出現重複的人名,如果無法滿足此條件,則不再繼續傳遞該祭品;
7. 當所有的祭品都不再傳遞後,遊戲結束;
遊戲開展得非常順利。遊戲結束後,祭司們將收集同時滿足如下三個條件的祭品用於接下來的豐收祭活動:
1. 此祭品回到了最初準備它的人手中;
2. 盛放此祭品的木托盤上至少有4個名字,至多有14個名字;
3. 如果有多個木托盤上的名字完全一樣(不區分名字的排列順序),則從其中隨機選擇乙個木托盤所對應的祭品。
已知這兩個部落裡的所有人都不重名,並且部落a的人和部落b的人之間的好朋友關係以附件的csv資料**檔案給出,其中行索引代表部落a中的人,列索引代表部落b中的人,**中的數字「1」代表他們兩人是好朋友,「0」代表他們兩人不是好朋友。請問:
如果以木托盤上的名字的數量對用於豐收祭的祭品分類,每一類分別最多有多少個祭品?
木托盤上有4個名字的祭品最多有()個;木托盤上有6個名字的祭品最多有()個;木托盤上有8個名字的祭品最多有()個;木托盤上有10個名字的祭品最多有()個;木托盤上有12個名字的祭品最多有()個;木托盤上有14個名字的祭品最多有()個;
依據資料來看,a部落有256個人,b部落有640個人。a部落和b部落的人只能給對方部落的人,以人為節點建圖,可以發現這是乙個二分圖。excel資料中給的是鄰接矩陣,我們轉換成鄰接表,然後題目的問題轉化成:每個節點出發可以有很多條路徑,問其中環的數量有幾個,並且是路徑大於等於4小於等於14的環的數量,最後要去重。我們以每個節點作為起點,進行dfs,並進行計數,統計每種長度的路徑條數,最後再去重。(此處感謝群裡的大佬提供的思路!)
1.將b部落的人用編號0-639表示,將a部落的人用編號700-955表示,將excel中的鄰接矩陣轉換為鄰接表。
2. 第一列表示i號節點,第二列數字表示有k個好朋友,再後面k列的數字就表示好朋友分別是誰。
3.對每個節點開始進行深度優先搜尋,對i個節點,開始先賦給vis陣列初值,所有節點都沒訪問過,訪問i,然後依次訪問與他相鄰的點,一直遞迴下去,直到找到訪問過的節點。若該節點被訪問過,則判斷該節點是不是根節點,如果是則滿足題意,記錄該路徑長度,返回。否則,就此節點就不再遞迴,直接返回。由於題目只要路徑為4-14的環,所以設定遞迴深度小於等於14。
4.由於用dfs算出來的結果是會出現重複:
比方說1->2->3->4->1 用星標記另外乙個部落
由於是無向圖:
他會出現1->4->3->2->1
也會出現3->4->1->2->3
也會出現3->2->1->4->3
……如果迴圈節是i就會由i * 2種可能會被dfs到,所以要去重,最後路徑長度為i的數量的要除以i * 2,最後得到去重結果。
5.剪枝優化
在第二階段的資料集變成了1344 * 1344。進行暴力dfs會做很多無用功。所以要進行剪枝優化。打算把在上述的演算法中,路徑1->2->3->4->1在別的節點的dfs中還會出現3->4->1->2->3,這實際上是乙個圈,我們需要在dfs中避免這種重複的計算。考慮到在第i個節點統計完圈了以後,在第i+1個節點中,如果訪問到第i個節點,那麼我們直接跳過這個節點,就可以避免在後面的dfs中重複出現前面統計過的點。那麼我們只需要建立乙個陣列vv,用來統計哪些節點之前統計過,然後給他附上dfs過的標記,再後面的節點的統計的時候可以直接跳過這個點,就可以不重複算某個圈,這樣就可以在後面的dfs達到剪枝的效果。
有任何問題,均可通過公告中的***聯絡我
2023年中興捧月 傅利葉
iwehdio的 初賽賽題題目 資料 源 提交的文件 複賽答辯ppt和決賽題目見 初賽使用python語言,初賽第二階段執行時間在6 7s。初賽第一,決賽參與獎。剛開始對題意有乙個初步的了解。要求的是最大的數量,所以跟每人準備的數量無關,而是只跟朋友關係的複雜程度有關。將部落中的每個人進行編號,按正...
中興捧月 傅利葉 豐收祭前的遊戲(果然菜)
在某片遙遠的大陸上,居住著兩個世代友好的部落,分別是部落a和部落b。他們一起耕耘勞作,互相幫助,親如一家。久而久之,部落裡的每個人都在對方部落裡找到了志趣相投,互相欣賞的好朋友。有的人性格熱情開朗,好朋友很多 有的人性格沉穩內斂,好朋友相對少一些。每到秋天豐收的季節,這兩個部落的人民都會聚集在一起舉...
No 4 中興捧月競賽總結
今天天熱,就睡實驗室了,開著空調。夜裡,沒心情睡覺,今天中興程式競賽複賽結果已出,沒能殺進決賽,有點小遺憾。但回想起來,從 4月份開始,經歷組隊,預賽選拔,初賽,複賽,一路走來還是深有感觸。個人而言,對任何事如果說只注重過程,不關注結果,那絕對是一句安慰人的話。凡事盡力而為之,盡力求得更好結果。旅程...