复制书稿(信息学奥赛一本通-T1278)
生活随笔
收集整理的這篇文章主要介紹了
复制书稿(信息学奥赛一本通-T1278)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
現在要把m本有順序的書分給k個人復制(抄寫),每一個人的抄寫速度都一樣,一本書不允許給兩個(或以上)的人抄寫,分給每一個人的書,必須是連續的,比如不能把第一、第三和第四本書給同一個人抄寫。
現在請你設計一種方案,使得復制時間最短。復制時間為抄寫頁數最多的人用去的時間。
【輸入】
第一行兩個整數m,k;(k≤m≤500)
第二行m個整數,第i個整數表示第i本書的頁數。
【輸出】
共k行,每行兩個整數,第i行表示第i個人抄寫的書的起始編號和終止編號。k行的起始編號應該從小到大排列,如果有多解,則盡可能讓前面的人少抄寫。
【輸入樣例】
9 3?? ??? ??? ?
1 2 3 4 5 6 7 8 9
【輸出樣例】
1 5
6 7
8 9
【源程序】
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 101 #define MOD 2520 #define E 1e-12 using namespace std; int a[N],b[N],c[N][N]; int sum[N],f[N][N]; int main() {int m,n;cin>>m>>n;for(int i=1;i<=m;i++){cin>>a[i];sum[i]=sum[i-1]+a[i];}sum[0]=0;memset(f,INF,sizeof(f));for(int i=1;i<=m;i++)f[1][i]=sum[i];//分段取大,狀態取小for(int i=2;i<=n;i++)for(int j=1;j<=m;j++)for(int k=i-1;k<j;k++)f[i][j]=min(f[i][j],max(f[i-1][k],sum[j]-sum[k]));int maxx=f[n][m];int temp=n;for(int i=m;i>0;i--){if(a[i]+b[temp]>maxx)temp--;b[temp]+=a[i];c[temp][++c[temp][0]]=i;}for(int i=1;i<=n;i++)cout<<c[i][c[i][0]]<<" "<<c[i][1]<<endl;return 0; }?
總結
以上是生活随笔為你收集整理的复制书稿(信息学奥赛一本通-T1278)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FBI树(信息学奥赛一本通-T1365)
- 下一篇: 暑期训练日志----2018.8.20