zoukankan      html  css  js  c++  java
  • 2016 Al-Baath University Training Camp Contest-1 I

    Description

    It is raining again! Youssef really forgot that there is a chance of rain in March, so he didn't fix the roof of his house. Youssef's roof is 1-D, and it contains n holes that make the water flow into the house, the position of hole i is denoted as xi where (0 ≤ i < n). Youssef has to put strips at the bottoms of those holes in order to prevent the water from flowing. Let's say there is a hole in position 4 and another hole in position 6, and Youssef decided to use a strip of length 3 to cover those two holes, then he places the strip from position 4 to 6 (it covers positions 4,5,6) and it covers the two holes. He can buy exactly k strips, and he must pay a price equal to the longest strip he buys. What is the minimum length l he can choose as the longest strip in order to keep his house safe?

    Input

    The input consists of several test cases. The first line of the input contains a single integer T, the number of the test cases. Each test case consists of two lines: the first line contains two space-separated integers, n and k (1 ≤ k < n ≤ 100000), denoting the number of the holes in the roof, and the number of the strips he can buy respectively. The second line of the test case contains n integers (x0, x1, ..., xn - 1): (0 ≤ xi ≤ 109), denoting the positions of holes (these numbers are given in an increasing order).

    Output

    For each test case print a single line containing a single integer denoting the minimum length l he can choose in order to buy k strips (the longest of them is of length l) and cover all the holes in his house using them.

    Example
    input
    3
    5 2
    1 2 3 4 5
    7 3
    1 3 8 9 10 14 17
    5 3
    1 2 3 4 20
    output
    3
    4
    2
    Note
                                     

    In the second test case the roof looks like this before and after putting the strips.

     题意:屋顶漏水,现在知道xi处是漏的,可以使用k块布盖住,问最短布的长度为多少

    解法:二分,首先当然是最大的数字/k,得到最长的长度,然后二分判断

    #include <iostream>
    #include <stdio.h>
    #include <cstring>
    using namespace std;
    int a[100005];
    int main(){
    	int T;
    	scanf("%d",&T);
    	while(T--){
    		int n,m;
    		scanf("%d %d",&n,&m);
    		for(int i=0;i<n;i++){
    			scanf("%d",&a[i]);
    		}
    		int l=0,r=a[n-1]/m+1;
    		while(l<=r){
    			int mid=(l+r)/2;
    			int x=a[0]+mid-1,cnt=1;
    			for(int i=0;i<n;i++){
    				if(a[i]>x){
    					cnt++;
    					x=a[i]+mid-1;
    				}
    			}
    			if(cnt<=m){
    				r=mid-1;
    			}else{
    				l=mid+1;
    			}
    		}
    		printf("%d
    ",r+1);
    	}
    }
    

      

  • 相关阅读:
    maven打包额外的资源文件
    阿里巴巴的程序员等级
    sql是最成功的第四代语言
    nginx的配置与应用
    浏览器的同源策略与跨域问题的解决方案
    算法:二分查找(基础)
    动态类型语言和静态类型语言
    【VS开发】单文档中往视图中加入控件
    【VS开发】使用VS2010创建MFC ActiveX工程项目
    【VS开发】使用VS2010创建MFC ActiveX工程项目
  • 原文地址:https://www.cnblogs.com/yinghualuowu/p/6049339.html
Copyright © 2011-2022 走看看