当前位置:
首页 >
复制书稿(信息学奥赛一本通-T1278)
发布时间:2025/3/17
32
豆豆
生活随笔
收集整理的这篇文章主要介绍了
复制书稿(信息学奥赛一本通-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