2020編碼大賽(5)半決賽

2021-10-10 04:22:58 字數 3671 閱讀 9561

2020編碼大賽題目  

半決賽,是32個隊伍選出8個隊伍。

一,需求變更

我的解讀:

1,檔案大小是1024的倍數

2,可以混合裝載

3,排程階段可以訪問檔案

二,壓縮演算法

在寫了乙個很簡單的lzw演算法之後,經過多日的攻堅,終於把ppmd寫出來了。

壓縮率:

2:7,也就是說一般情況下可以裝載7份

這裡列出了1m、2m、3m的檔案壓縮後的大小:

效能:壓縮1m需要0.4秒,壓縮7m需要2s

三,變更應對

1,檔案大小是1024的倍數

這部分簡單,只需要修改計算容量的方式即可

// 礦堆所有礦的大小之和

static int getunitssize(vectorv)

return ans;

}// 礦堆所有礦的大小之和

static int getresourcenum(pos p)

return getunitssize(g_resourceunits[p.x][p.y]);

}

2,可以混合裝載

可以混合裝載的話,就可以衍生出很多策略。

我加入了乙個很重要的機制:把選礦和選礦堆2個邏輯進行分離,先選定礦堆,然後把所有礦堆的所有礦放在一起進行挑選

// 這條路徑要裝載多少m資源是》=col顏色的

static int getpathpower(vectorp, int col)

}if (ans > remainsize())

return ans;

}// 第一次呼叫,path是worker到基地這2個點

static bool gettarget(vector&path, int col)}}

tmp = getminpos(m);

vectortemp;

if (!samepos(tmp, pos ))

return false;

}static void play(pos start, pos end, vector&path)

}g_power2 = g_myteam.worker.power;

while (getpathsize(tar) < remainsize() && g_myteam.worker.power > 0)

}while (getpathsize(tar) < remainsize() && g_myteam.worker.power > 0)

}while (getpathsize(tar) < remainsize() && g_myteam.worker.power > 0)

}g_myteam.worker.power = g_power2;

for (int i = 0; i < m; i++)

}if (samepos(*(tar.end() - 1), g_posflag))

int ret = getpath(tar, path);

if (ret == -1)

}

從礦堆的所有礦中,挑選礦的方法就是,先排序,再按順序裝載

static bool cmp(resourceunit a, resourceunit b)

return a.sizeofunit > b.sizeofunit;

}// 從礦堆裡面選礦

static vectortake(vectorp, int num, int &power)

}sort(tmp.begin(), tmp.end(), cmp);

int rm = g_myteam.worker.maxload - g_myteam.worker.load, s = 0;

num = power = 0;

for (unsigned i = 0; i < tmp.size(); i++)

ans.push_back(tmp[i]);

s += ret, num++, power += tmp[i].sizeofunit / 1024 * tmp[i].gemtype;

}return ans;

}static vectortake(vectorp)

static void play()

g_path = join(g_path, path);

return;

}play(workerpos, g_posflag, g_path);

setcollectcommands(take(g_path));

}

cmp函式裡面蘊含了乙個策略:先裝大的再裝小的,因為我的壓縮演算法壓縮大檔案壓縮率更高

ps:我沒有仔細研究這一點,或許是和待壓縮檔案有關,和演算法無關。真相不重要,結果都一樣。

3,排程階段可以訪問檔案

我的壓縮演算法沒有別人的壓縮率高,但是壓縮很快,所以這個優勢要利用起來。

經過簡單的計算,發現10秒完全可以勝任16m的壓縮任務,所以這裡有個重要的策略:

在選出礦堆並把所有礦排序之後,按順序一邊裝載一邊呼叫壓縮介面,實時計算剩餘空間,這樣才能盡量裝滿。

為了加速,我加了標記,在排程的時候呼叫壓縮介面的話,就不需要輸出,從而加速程式執行。

static void normalize(cpd *p)

}while (con1)

}int compress(string s)

compress();

return g_com / 1024 + 1;

}

上面的take函式裡面呼叫了這個compress過載函式。

為了保證不超時,我還加入了定時機制,只在壓縮入口處加了定時。

在最後的決賽中,我發現這裡寫的有個問題,當時間超過閾值時,也不應該直接返回常數comsize,而應該根據歷史壓縮記錄去評估。(這個函式本來就已經有了)

四,未上線策略

有個策略我想到了,而且寫的差不多了,但最終還是沒上線,主要是來不及除錯。

在選礦堆的時候,我是先選紅礦,再選綠礦,再選藍礦,礦堆被選取的順序和被走到的順序是一樣的,即走過的路徑肯定是紅紅紅綠綠藍藍藍這種的。

然而實際上,如果在從乙個紅礦走到另外乙個紅礦的過程中經過了綠礦,當我決定開始選綠礦的時候,應該先把這些經過的綠礦加入到待選列表中

// 新增經過的礦堆

static vectorextend(vectorv, int col)

pos tmp = *(v.end() - 1);

v.erase(v.end() - 1);

vectorans, path;

getpath(v, path);

ans.push_back(path[0]);

for (int i = 0; i < path.size() - 1; i++)

}if (path.size() - 1 > 0)

ans.push_back(tmp);

return ans;

}

2020編碼大賽(3)無失真壓縮演算法

無失真壓縮演算法,按照我的理解,可以分為三大塊知識 直接編碼 轉換 上下文編碼。一,直接編碼 1,哈夫曼編碼 哈夫曼編碼就是把各個字元轉換成不同長度的01串,按照固定的替換規則全文替換即可。當然,哈夫曼編碼的依據,可以是硬編碼的,也可以是根據文字內容統計計算出來的。2,算術編碼 區間編碼 這2個編碼...

普渡機械人助力2020全球5G應用大賽

12月22日,備受矚目的2020全球5g應用大賽 中國 深圳 頒獎禮在深圳灣體育中心盛大舉行。大賽圍繞5g 工業網際網路 5g 智慧型城市 5g 交通出行等十個賽道展開角逐。華為河圖x5g作品榮獲 年度最佳應用獎 lgu 5gar vr服務等5個作品榮獲 優秀場景獎 5g 網路3d院線等5個作品榮獲...

杭電oj編碼2020

問題描述 輸入n n 100 個整數,按照絕對值從大到小排序後輸出。題目保證對於每乙個測試例項,所有的數的絕對值都不相等。輸入 輸入資料有多組,每組佔一行,每行的第乙個數字為n,接著是n個整數,n 0表示輸入資料的結束,不做處理。輸出 對於每個測試例項,輸出排序後的結果,兩個數之間用乙個空格隔開。每...