zoukankan      html  css  js  c++  java
  • 洛谷 P1281 书的复制 题解

    P1281 书的复制

    题目背景

    大多数人的错误原因:尽可能让前面的人少抄写,如果前几个人可以不写则不写,对应的人输出0 0。

    不过,已经修改数据,保证每个人都有活可干。

    题目描述

    现在要把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

    【思路】

    二分答案

    【吐槽】

    二分答案模板题目
    但他的输出却很恶心人
    因为要让后面的人尽量多抄的嘛
    所以就要从后往前枚举
    这样才能让后面的人尽量多抄
    但是输出的时候却是从1-k依次输出每个人到底抄哪个范围内的书
    所以很讨厌

    【核心思路】

    这是让抄的页数最多的人抄的最少
    最大值最少
    所以二分答案为什么要用就很显然了
    二分抄的最多那个人抄了多少
    然后从后往前枚举
    check一下是不是满足在抄的最多的那个人抄的页数小于等于二分出来的这个数的情况下
    可以被小于等于k个人抄完
    如果能就返回真
    反之返回假
    这样就可以轻轻松松的二分一下一下了

    【完整代码】

    #include<iostream>
    #include<cstdio>
    
    using namespace std;
    const int Max = 505;
    int a[Max];
    int xx[Max],yy[Max];
    int k,m;
    bool check(int x)
    {
    	int tot = 0;
    	int js = 0;
    	for(register int i = m;i >= 1;i --)
    	{
    		if(a[i] > x)
    			return false;
    		tot += a[i];
    		if(tot > x)
    		{
    			if(js == k - 1)
    				return false;
    			else
    				tot = a[i],js ++;
    		}
    		if(js == k && i != 1)
    			return false;
    	}
    	return true;
    }
    
    int main()
    {
    	int tot = 0;
    	cin >> m >> k;
    	for(register int i = 1;i <= m;++ i)
    		cin >> a[i],tot += a[i];
    	int l = 0,r = tot;
    	while(l < r)
    	{
    		int mid = (r + l) >> 1;
    		if(check(mid))
    			r = mid;
    		else
    			l = mid + 1;
    	}
    	yy[k] = m;
    	int sum = k;
    	int ans = 0;
    	a[0] = 9999999;
    	for(register int i = m;i >= 0;i --)
    	{
    		ans += a[i];
    		if(ans > l)
    		{
    			ans = a[i];
    			xx[k] = i + 1;
    			k --;
    			yy[k] = i;
    		}
    	}
    	for(register int i = 1;i <= sum;++ i)
    		cout << xx[i] << " " << yy[i] << endl;
    	return 0;
    }
    
  • 相关阅读:
    java根据图片路径下载到服务器方案 (转)
    什么是JSP (转)
    获取给定月中哪些天有聊天记录
    患者咨询服务区数据获取
    获取 不在当前设置录入状态,但是曾经设定过的测量指标 的最后测量日期
    MySQL 常用函数之——substr()
    MySql查询时间段的方法(转)
    MySQL 百万级分页优化(Mysql千万级快速分页)(转)
    mysql的sql分页函数limit使用 (转)
    MySql实现分页查询的SQL,mysql实现分页查询的sql语句 (转)
  • 原文地址:https://www.cnblogs.com/acioi/p/11706685.html
Copyright © 2011-2022 走看看