0
已解决
张帆
中级天翼
中级天翼
题目描述 Description
新学期又要开始了,打印社的生意也渐渐开始好转,现在打印社的老板要把m本有顺序的书分给k个员工去抄写,每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一、第三、第四本书给同一个人抄写。现在请你设计一种方案,使得复制时间最短。复制时间为抄写页数最多的人用去的时间。
输入描述 Input Description
第一行两个整数m,k;(k≤m≤500)
第二行m个整数,第i个整数表示第i本书的页数。
输出描述 Output Description
共k行,每行两个整数,第i行表示第i个人抄写的书的起始编号和终止编号。k行的起始编号应该从小到大排列,如果有多解,则尽可能让前面的人少抄写。
样例输入 Sample Input
9 3
1 2 3 4 5 6 7 8 9
样例输出 Sample Output
1 5
6 7
8 9
本蒟蒻WA60:
#include<iostream>
using namespace std;
int m,k;
int a[510],step[510][2];
bool check(int tmp){
int cnt=0,sum=0;
for(int pos=m;pos>=1;pos--){
if(sum+a[pos]>tmp||pos==1){
sum=0;
cnt++;
sum=a[pos];
} else { sum+=a[pos]; }
}
if(cnt<=k){
return true;
}
else return false;
}
int main(){
cin>>m>>k;
for(int i=1;i<=m;i++) cin>>a[i];
int l=1,r=1000000;
while(l+1<r){
int mid=(l+r)/2;
if(check(mid)) r=mid;
else l=mid;
}
if(m==k){
for(int i=1;i<=m;i++) cout<<i<<" "<<i<<"\n";
return 0;
}
int cnt=0,sum=0;
step[1][0]=m;
for(int i=m;i>=1;i--){
if(sum+a[i]>r||i==1){
cnt++;
step[cnt][1]=i+1;
step[cnt+1][0]=i;
sum=a[i];
} else { sum+=a[i]; }
}
step[k][1]=1;
for(int i=k;i>=1;i--){
cout<<step[i][1]<<" "<<step[i][0]<<"\n";
}
return 0;
}
0
0
汪恺恒
中级启示者
中级启示者
主函数
scanf("%d %d",&n,&m);
if(n==0){
return 0;
}
int l=0,r,mid;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
r+=a[i];
}
while(l<=r){
mid=(l+r)/2;
if(ch(mid)){
ans=mid;
r=mid-1;
}
else l=mid+1;
}
pr(1,n);
ch函数
bool ch(int x){
int su=0,an=0;
for(int i=n;i>=1;i--){
if(i==1)
an++;
if(su+a[i]<=x){
su+=a[i];
}
else{
an++;
su=a[i];
}
}
if(an<=m){
return 1;
}
return 0;
}
pr函数自己想(输出方案)
0
0
0