zoukankan      html  css  js  c++  java
  • F

    前段时间,某省发生干旱,B山区的居民缺乏生活用水,现在需要从A城市修一条通往B山区的路。假设有A城市通往B山区的路由m条连续的路段组成,现在将这m条路段承包给n个工程队(≤ ≤ 300)。为了修路的便利,每个工程队只能分配到连续的若干条路段(当然也可能只分配到一条路段或未分配到路段)。假设每个工程队修路的效率一样,即每修长度为1的路段所需的时间为1。现在给出路段的数量m,工程队的数量n,以及m条路段的长度(这m条路段的长度是按照从A城市往B山区的方向依次给出,每条路段的长度均小于1000),需要你计算出修完整条路所需的最短的时间(即耗时最长的工程队所用的时间)。

    Input

    第一行是测试样例的个数,接下来是T个测试样例,每个测试样例占2行,第一行是路段的数量m和工程队的数量n,第二行是m条路段的长度。

    Output

    对于每个测试样例,输出修完整条路所需的最短的时间。

    Sample Input

    2
    4 3
    100 200 300 400
    9 4
    250 100 150 400 550 200 50 700 300
    

    Sample Output

    400
    900

            简单的二分+模拟,注意读题(千万别读错)

            AC:代码

            

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int a[303];
    int main()
    {
    	int t;
    	cin>>t;
    	while(t--)
    	{
    		int n,m,low = 0,high = 0,mid;
    		cin>>n>>m;
    		for(int i = 0;i<n;i++){
    			scanf("%d",&a[i]);
    			if(a[i]>low) low = a[i];
    			high = high + a[i];
    		}
    		while(high>low){
    			mid = (low + high)/2;
    			int tt = a[0];
    			int ans = 1;
    			for(int i = 1;i<n;i++){
    				if(tt+a[i]>mid){
    					ans++;tt = a[i];
    				}
    				else{
    					tt += a[i];
    				}
    			}
    			if(ans>m){
    				low = mid + 1;
    			}
    			else{
    				high = mid;
    			}
    		}printf("%d
    ",low);
    	}
    	return 0;
    }


        

  • 相关阅读:
    选择法与冒泡法
    递归法把一个整数通过字符串输出,谭浩强教材习题
    十六进制转十进制 2.0
    十六进制转十进制 谭浩强教材课后习题
    链表操作(改)--学生管理
    矩阵转置(有问题待补充)
    win10 PowerShell下安装vim编辑器
    wsl2+.net core+vscode开发调试环境
    git 一些常用的操作命令
    查看数据库所有表数据占用的空间大小
  • 原文地址:https://www.cnblogs.com/Nlifea/p/11746040.html
Copyright © 2011-2022 走看看