題目詳見:
本題有兩種解法:
一.動態規劃
類似於乘積最大那道題,關鍵是劃分好書的分配方式,因為書本抄寫是連續的,因此該問題是滿足無後效性的,我們可以以抄書的人數為階段,dp[i][j]表示前i個人抄寫j本書需要抄寫所消耗的最少時間.
動態規劃轉移方程為:dp[i][j] = min(dp[i][j],max(dp[i-1][k],s[j] - s[k]));其中1 <= k < j,s陣列是字首和, s[i]代表從1至i本書的頁數和.
具體實現見**:
#include#include#include#includeusing namespace std;
int n,m;
int book[505],s[505];
int dp[505][505]; //dp[i][j]代表前j本書由i個人複製的最優值
int ans[505][3]; //ans[i][1]用來存第i個人複製書稿的起點,ans[i][2]用來存第i個人複製書稿的終點。
void cal(int x)
ans[j][1] = k+1;
end = k;
}}int main()
for(int i = 2; i<= m; i++)}}
cal(dp[m][n]);
for(int i = 1; i <= m; i++)
return 0;
}
#includeusing namespace std;
int n,m;
int book[505],s[505],ans[505][3],le,ri;
int pd(int x)
ans[k][1] = i+1;
k--;
}if( i > 0)
return false;
else
return true;
}void calans(int x)
ans[k][1] = i+1;
k--;
}}int main()
le = 0;ri = s[n] +1;
while(le+1 < ri)
else
le = mid;
}calans(ri) ;
for(int i = 1; i<= m; i++)
return 0;
}
書的複製 normal DP
time limit 1000ms memory limit 65536k total submit 164 accepted 83 description 現在要把m mm本有順序的書分給k kk個人複製 抄寫 每個人的抄寫速度都一樣,一本書不允許分給兩個或兩個以上的人抄寫,分給每個人的書,必須是...
書的複製 題解
現在要把m本有順序的書分給k個人複製 抄寫 每個人的抄寫速度都一樣,一本書不允許分給兩個或兩個以上的人抄寫,分給每個人的書,必須是連續的,比如不能把第 一 第三 第四本書給同乙個人抄寫。現在請你設計一種方案,使得複製時間最短。複製時間為抄寫最多的人用去的時間。第一行兩個整數,m,k k m 500 ...
書的複製(抄書問題)
現在要把 m 本有順序的書分給 k 給人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三 第四本書給同乙個人抄寫。現在請你設計一種方案,使得複製時間最短。輸出共 k 行,每行兩個整數,第 i 行表示第 i 個人抄寫的書...