classSolution{public:intminCount(vector<int>& coins){int i, sum =0;for(i =0; i < coins.size();++i)sum +=ceil(coins[i]/2.0);return sum;}};
執(zhí)行用時(shí):4 ms 內(nèi)存消耗:8.4 MB
2.2 傳遞信息 Esay
題目鏈接 小朋友 A 在和 ta 的小伙伴們玩?zhèn)餍畔⒂螒?#xff0c;游戲規(guī)則如下:
有 n 名玩家,所有玩家編號(hào)分別為 0 ~ n-1,其中小朋友 A 的編號(hào)為 0
每個(gè)玩家都有固定的若干個(gè)可傳信息的其他玩家(也可能沒有)。
傳信息的關(guān)系是單向的(比如 A 可以向 B 傳信息,但 B 不能向 A 傳信息)。
每輪信息必須需要傳遞給另一個(gè)人,且信息可重復(fù)經(jīng)過同一個(gè)人
給定總玩家數(shù) n,以及按 [玩家編號(hào),對(duì)應(yīng)可傳遞玩家編號(hào)] 關(guān)系組成的二維數(shù)組 relation。 返回信息從小 A (編號(hào) 0 ) 經(jīng)過 k 輪傳遞到編號(hào)為 n-1 的小伙伴處的方案數(shù);若不能到達(dá),返回 0。
示例 1:
輸入:n =5, relation =[[0,2],[2,1],[3,4],[2,3],[1,4],[2,0],[0,4]], k =3
輸出:3
解釋:信息從小 A 編號(hào) 0 處開始,經(jīng) 3 輪傳遞,到達(dá)編號(hào) 4。
共有 3 種方案,分別是 0->2->0->4, 0->2->1->4, 0->2->3->4。示例 2:
輸入:n =3, relation =[[0,2],[2,1]], k =2
輸出:0
解釋:信息不能從小 A 處經(jīng)過 2 輪傳遞到編號(hào) 2限制:
2<= n <=101<= k <=51<= relation.length <=90, 且 relation[i].length ==20<= relation[i][0],relation[i][1]< n
且 relation[i][0]!= relation[i][1]
解答:
把路徑的邊插入set,方便后面快速查找
dp[i][j] 表示第i次傳遞到j(luò)的方案數(shù)
classSolution{public:intnumWays(int n, vector<vector<int>>& relation,int k){set<vector<int>> s;for(auto re : relation)s.insert(re);vector<vector<int>>dp(k+1,vector<int>(n,0));dp[0][0]=1;//初始狀態(tài)for(int i =1; i <= k;++i)//k次傳遞{for(int j =0; j < n;++j){//n個(gè)人,如果存在傳遞到這的情況if(dp[i-1][j]!=0){for(int k =0; k < n;++k){//傳給下一個(gè)人,可以傳給跟自己有關(guān)系的if(s.count({j,k}))//有關(guān)系dp[i][k]+= dp[i-1][j];}}}}return dp[k][n-1];}};
執(zhí)行用時(shí):8 ms 內(nèi)存消耗:7.6 MB
classSolution{//更簡潔的版本public:intnumWays(int n, vector<vector<int>>& relation,int k){int dp[6][10]={0};dp[0][0]=1;for(int i=0;i<k;i++)for(auto ss:relation)dp[i+1][ss[1]]+= dp[i][ss[0]];return dp[k][n-1];}//參看作者:xunh};
classSolution{public:intminJump(vector<int>& jump){int i, j, n = jump.size(), t =0, size,tp;set<int> set;for(i =0; i < n;++i)set.insert(i);queue<int> q;q.push(0);set.erase(0);while(!q.empty()){size = q.size();t++;while(size--){tp = q.front();q.pop();if(tp+jump[tp]>= n)return t;if(set.count(tp+jump[tp])){q.push(tp+jump[tp]);set.erase(tp+jump[tp]);}auto end = set.upper_bound(tp);//這個(gè)地方多了lgn的查找,用數(shù)組降到O(1)for(auto it = set.begin(); it != end;++it){q.push(*it);set.erase(*it);}}}return t;}};
改進(jìn)的BFS
classSolution{public:intminJump(vector<int>& jump){int i, n = jump.size(), t =0, size, tp, prevPos =0;vector<bool>vis(n,false);vis[0]=true;queue<int> q;q.push(0);while(!q.empty()){size = q.size();t++;while(size--){tp = q.front();q.pop();if(tp+jump[tp]>= n)return t;if(!vis[tp+jump[tp]]){//向右跳過來q.push(tp+jump[tp]);vis[tp+jump[tp]]=true;}for(i = prevPos+1; tp >0&& i < tp;++i){//向左位置跳if(!vis[i]){q.push(i);vis[i]=true;}}prevPos =max(prevPos,tp);//沒有這句會(huì)超時(shí)//避免重復(fù)檢查某些位置}}return t;}};
在一個(gè) CPU 核執(zhí)行某個(gè)任務(wù)時(shí),我們可以在任何時(shí)刻暫停當(dāng)前任務(wù)的執(zhí)行,并保留當(dāng)前執(zhí)行進(jìn)度。在下次繼續(xù)執(zhí)行該任務(wù)時(shí),會(huì)從之前停留的進(jìn)度開始繼續(xù)執(zhí)行。暫停的時(shí)間可以不是整數(shù)。
現(xiàn)在,系統(tǒng)有兩個(gè) CPU 核,即我們可以同時(shí)執(zhí)行兩個(gè)任務(wù),但是同一個(gè)任務(wù)不能同時(shí)在兩個(gè)核上執(zhí)行。 給定這顆任務(wù)樹,請(qǐng)求出所有任務(wù)執(zhí)行完畢的最小時(shí)間。