九章演算法--分配抄書員

來源:互聯網
上載者:User

標籤:style   blog   color   os   io   for   div   代碼   

思路:

(1)最常見的思路就是dp:狀態表示為dp[i][j],表示前j個人抄i本書最少時間;dp[i][j] = min(max(dp[k][j-1],sum(k+1,i))) (j<=k<i);

解釋一下min,max操作,由於抄書是並行,所以就是取所有人時間裡的最大值

(2)二分+貪心:我自己一開始的思路是總和除以人數,然後貪心,但是這樣可能不是最優解。但是我們可以計算每個人最大和最小抄書的時間,然後二分搜尋這個時間即可。

下面代碼是DP:但是沒有考慮邊界情況只是寫來熟悉演算法流程。

 1 #include <iostream> 2 #include <string> 3 #include <memory.h> 4 #include <vector> 5 #include <sstream> 6 #include <math.h> 7 #include <climits> 8 #include <algorithm> 9 using namespace std;10 11 //dp:f[i][j]表示前i本書由j個抄書員來抄的最少時間,12 //f[i][j] = min(f[x][j-1]+sum(x+1,i))(j<=x<=i)13 ///sum[i][j]表示抄寫第i到第j本書需要的時間14 vector<int> book;15 int dp[100][100];16 int sum[100][100];17 int fun(int n,int m)18 {19     int i,j,k;20     int mintime=INT_MIN;21     22     for(i = 0 ; i < n ; ++i)23     {24         for(j = i ; j < m ;++j)25         {26             for(k = i ; k <= j ; ++k)27             {28                 sum[i][j]+=book[k];29             }30         }31     }32     for(i = 1 ; i <= n ; ++i)33         dp[i][1] = sum[0][i-1];34     for(j = 2 ; j <= m ; ++j)35     {36         for(i = j ; i <= n ; ++i)37         {38             dp[i][j]= INT_MAX;39             for(k = j ; k <= i ; ++k)40             {41                 mintime = max(dp[k][j-1],sum[k][i-1]);42                 dp[i][j] = min(dp[i][j],mintime);43             }44         }45     }46     return dp[n][m];47 }48 49 int main()50 {51 52     return 0;53 }

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.