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表示輸入資料的結束,不做處理。輸出 對於每個測試例項,輸出排序後的結果,兩個數之間用乙個空格隔開。每...