在某片遙遠的大陸上,居住著兩個世代友好的部落,分別是部落a和部落b。他們一起耕耘勞作,互相幫助,親如一家。久而久之,部落裡的每個人都在對方部落裡找到了志趣相投,互相欣賞的好朋友。有的人性格熱情開朗,好朋友很多;有的人性格沉穩內斂,好朋友相對少一些。
每到秋天豐收的季節,這兩個部落的人民都會聚集在一起舉行盛大的「豐收祭」,來祈禱下一年的風調雨順。今年的豐收祭馬上又要舉行了。為了進一步增進兩個部落的友誼,也為了明年能有乙個好收成,這兩個部落的祭司們商量後決定:在今年的豐收祭前舉辦一場特別的「擊鼓傳花」遊戲。只不過遊戲中並非有人真的擊鼓,並且所傳遞的「花」也不是真的花,而是等待在豐收祭上獻上的祭品。
遊戲規則如下:
兩個部落的所有人都可以事先準備自己的祭品,且每個人的祭品樣式都不同,每乙個祭品都分別盛放在乙個相對應的木托盤裡;準備此祭品的人熟悉自己的祭品;
每個人可以準備的祭品數量不限;祭品的最小不可分割單位是1份;
遊戲開始後,在整個遊戲過程中,每個人都能且只能將祭品(包括木托盤)傳遞給自己在對方部落裡的好朋友們,每個好友可以接收的祭品數量不限;
收到祭品的人必須在盛放此祭品的木托盤上刻上自己的名字(代表留下自己美好的祝願),隨後按按照上一條規則,繼續傳遞;
如果祭品回到最初準備此祭品的人手中,此人也在木托盤上刻上自己的名字之後,終止傳遞;
木托盤上不允許出現重複的人名,如果無法滿足此條件,則不再繼續傳遞該祭品;
當所有的祭品都不再傳遞後,遊戲結束;
遊戲開展得非常順利。遊戲結束後,祭司們將收集同時滿足如下三個條件的祭品用於接下來的豐收祭活動:
此祭品回到了最初準備它的人手中;
盛放此祭品的木托盤上至少有4個名字,至多有14個名字;
如果有多個木托盤上的名字完全一樣(不區分名字的排列順序),則從其中隨機選擇乙個木托盤所對應的祭品。
已知這兩個部落裡的所有人都不重名,並且部落a的人和部落b的人之間的好朋友關係以附件的csv資料**檔案給出,其中行索引代表部落a中的人,列索引代表部落b中的人,**中的數字「1」代表他們兩人是好朋友,「0」代表他們兩人不是好朋友。請問:
如果以木托盤上的名字的數量對用於豐收祭的祭品分類,每一類分別最多有多少個祭品?
這是乙個典型的二部圖,但是好像沒做過針對二部圖的問題,在我的知識領域只能把問題普遍化,看成乙個圖的問題。
通過csv構造乙個圖,找出所有的簡單環路,保證節點數在題目要求範圍內。
然後開始了編碼,基本思路是深搜,在所有通路中找到所有的環,然後去重並儲存在vector裡,**如下
#include "pch.h"
#include #include #include #include #include #include #include #include #include using namespace std;
const int maxrow = 256;//樣例資料行數
const int maxcol = 640;//樣例資料列數
const int maxn = maxrow + maxcol;//最大節點數,編號按照先行(第乙個部落)後列(第二個部落)儲存,一共就是所有部落的人數。
//const int maxn = maxrow + maxcol + 5;//陣列加5,開大一點保險
vectornodes[maxn];//記錄節點連線情況
bool visited[maxn];//記錄節點訪問情況
vectorpath;//目前的訪問的點的路徑
vector> circles;//記錄最終所有的環
int result[15];//儲存長度為14以內的環的個數
//讀取csv檔案,獲取節點連線情況
void readcsv(string path)
string line; //臨時儲存一行字串
int row_index = 0; //行序號
while (getline(fin, line) && fin.good()) //整行讀取
col_index++;
} row_index++;
} fin.close();
return;
}//列印圖
void printnodes()
cout << endl; }}
//深搜
void dfs(int start, int pre)
else if (nodes[start][i] != pre)
if (j_index == -1)
cout << "not found" << endl;
else
for (int k = 0;k < circles.size();k++)
}if (!sameflag)
else
}/*else
{cout << "發現節點數為"<< circle_len <<"的環,不符要求,不計入"《但第乙個版本的**執行了很久也沒結果,並通過輸出中間結果看,是因為遞迴深度太深,時間花費巨大,因此考慮剪枝,路徑超過14的時候不向下遞迴,這樣只在14節點裡找環,但這樣就不能只從dfs(0)開始就可以找齊,就需要每個節點都dfs一下,於是產生了第二版本的**
但這個版本還是時間太長,就不貼了。是因為儘管我們只考慮14節點裡找環會漏掉一些環,但也不至於for迴圈進行dfs,這樣迴圈一圈比不迴圈找到的重複的環可能遠遠超過了不迴圈漏下的部分。但我又跑了一遍不迴圈的(存在遺漏)版本,時間還是太長。我痛改前非,是不是我策略出現問題了,可能是要利用二部圖的特點嗎?仔細看題目下邊這樣說:「留意觀察資料的特徵,參賽者也許可以找到提公升效率的思路。」 不禁陷入深思。。。。可能只有等比賽結束才能向榜上的大佬取經了,不過我也想再掙扎一下。
比賽結束了,來取經,榜上有名的大佬們果然思路各種trick,虛心學習,不重複造輪子了。
2023年中興捧月 傅利葉
iwehdio的 初賽賽題題目 資料 源 提交的文件 複賽答辯ppt和決賽題目見 初賽使用python語言,初賽第二階段執行時間在6 7s。初賽第一,決賽參與獎。剛開始對題意有乙個初步的了解。要求的是最大的數量,所以跟每人準備的數量無關,而是只跟朋友關係的複雜程度有關。將部落中的每個人進行編號,按正...
2020中興捧月傅利葉派記錄
前段時間看到了同學 的中興通訊的比賽鏈結,之前也沒有參加過演算法類的比賽,這次打算報著試一試的態度參加下,增加下經驗。在初步看了幾個門派的題目簡介後,發現只有傅利葉派比較適合自己,所以最終選擇了傅利葉派。目錄 在某片遙遠的大陸上,居住著兩個世代友好的部落,分別是部落a和部落b。他們一起耕耘勞作,互相...
傅利葉 灰度
假設你原來的圖象為 i n,n 傅利葉變換後的矩陣為 f n,n 顯示傅利葉變換後的圖象其實就是顯示矩陣 f n,n 啊,因為變換後的係數是複數,所以取幅值。同時為了顯示方便,有時候會進行 normalize,把 f n,n 的範圍變換到0 255區間,有時候為了突出黑 白對比,還會進行對數運算 l...