zoukankan      html  css  js  c++  java
  • P1281 书的复制[二分]

    题目描述

    现在要把m本有顺序的书分给k给人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一、第三、第四本书给同一个人抄写。

    现在请你设计一种方案,使得复制时间最短。复制时间为抄写页数最多的人用去的时间。

    输入输出格式

    输入格式:

    第一行两个整数m,k;(k≤m≤500)

    第二行m个整数,第i个整数表示第i本书的页数。

    输出格式:

    共k行,每行两个整数,第i行表示第i个人抄写的书的起始编号和终止编号。k行的起始编号应该从小到大排列,如果有多解,则尽可能让前面的人少抄写。

    输入输出样例

    输入样例#1:

    9 3
    1 2 3 4 5 6 7 8 9
    

    输出样例#1:

    1 5
    6 7
    8 9
    

    解析:

    我™终于会二分答案了

    很简单,贪心+二分答案,然而我输出写爆了。。。

    题解说可以倒推输出?为毛我错了。。。这题难点就在输出。


    题目可以看成:在一个数列中划分子段,使得最大子段和最小。

    思路:二分最大子段和,找一个使得最大子段和最小的可行解。

    贪心去检验可行性,具体证明直接数学归纳法。题目要求我们让前面的人尽可能少抄写,那我们就从后往前贪心。

    毒瘤:#6 需要特判。。。一个人都没有,一本书也没有的情况,什么都不输出。。。出题人怎么想的。。。

    递归的输出解,其实也可以像贪心一个套路去倒推输出,然而我错了?

    参考代码:

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<ctime>
    #include<cstdlib>
    #include<algorithm>
    #include<queue>
    #include<set>
    #include<map>
    #define N 501
    using namespace std;
    int m,k,a[N],maxx;
    bool check(int x)
    {
    	int pos=0,now=0;
    	for(int i=m;i>=1;i--){
    		if(i==1) pos++;
    		if(now+a[i]<=x) now+=a[i];
    		else{
    			++pos;now=a[i];
    		}
    	}
    	if(pos<=k) return 1;
    	else return 0;
    }
    void print(int l,int r,int maxx)
    {
    	int now=0;
    	for(int i=r;i>=l;i--){
    		if(now+a[i]>maxx){
    			print(l,i,maxx);
    			printf("%d %d
    ",i+1,r);
    			return;
    		}
    		now+=a[i];
    	}
    	printf("%d %d
    ",1,r);
    }
    int main()
    {
    	scanf("%d%d",&m,&k);
    	if(m==0&&k==0) return 0; 
    	for(int i=1;i<=m;++i) scanf("%d",&a[i]),maxx+=a[i];
    	int l=1,r=maxx;
    	while(l<r){
    		int mid=(l+r)>>1;
    		if(check(mid)) r=mid;
    		else l=mid+1;
    	}
    	print(1,m,l);
    	return 0;
    }
    
  • 相关阅读:
    对象池使用时要注意几点
    Flash3D学习计划(一)——3D渲染的一般管线流程
    714. Best Time to Buy and Sell Stock with Transaction Fee
    712. Minimum ASCII Delete Sum for Two Strings
    647. Palindromic Substrings(马拉车算法)
    413. Arithmetic Slices
    877. Stone Game
    338. Counting Bits
    303. Range Sum Query
    198. House Robber
  • 原文地址:https://www.cnblogs.com/DarkValkyrie/p/11191891.html
Copyright © 2011-2022 走看看