日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

复制书稿(信息学奥赛一本通-T1278)

發布時間:2025/3/17 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 复制书稿(信息学奥赛一本通-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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。