小招喵喜欢吃喵粮。这里有 N 堆喵粮,第 i 堆中有 p[i] 粒喵粮。喵主人离开了,将在 H 小时后回来。
小招喵可以决定她吃喵粮的速度 K (单位:粒/小时)。每个小时,她将会选择一堆喵粮,从中吃掉 K 粒。如果这堆喵粮少于 K 粒,她将吃掉这堆的所有喵粮,然后这一小时内不会再吃更多的喵粮。
小招喵喜欢慢慢吃,但仍然想在喵主人回来前吃掉所有的喵粮。
返回她可以在 H 小时内吃掉所有喵粮的最小速度 K(K 为整数)。
小招喵喜欢吃喵粮。这里有 N 堆喵粮,第 i 堆中有 p[i] 粒喵粮。喵主人离开了,将在 H 小时后回来。
小招喵可以决定她吃喵粮的速度 K (单位:粒/小时)。每个小时,她将会选择一堆喵粮,从中吃掉 K 粒。如果这堆喵粮少于 K 粒,她将吃掉这堆的所有喵粮,然后这一小时内不会再吃更多的喵粮。
小招喵喜欢慢慢吃,但仍然想在喵主人回来前吃掉所有的喵粮。
返回她可以在 H 小时内吃掉所有喵粮的最小速度 K(K 为整数)。
第一行输入为喵粮数组,以空格分隔的N个整数
第二行输入为H小时数
最小速度K
3 6 7 11 8
4
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] strs = br.readLine().split(" ");
        int n = strs.length;
        int[] foods = new int[n];
        // 速度下线为1,上线为max(foods)
        int lb = 1, ub = 0;
        for(int i = 0; i < n; i++){
            foods[i] = Integer.parseInt(strs[i]);
            ub = ub < foods[i]? foods[i]: ub;
        }
        int H = Integer.parseInt(br.readLine());
        int v = ub;
        while(lb <= ub){
            int m = lb + ((ub - lb) >> 1);
            if(timeConsume(foods, m) <= H){
                // 速度足够,往左二分
                v = m;
                ub = m - 1;
            }else{
                // 速度不够,往右二分
                lb = m + 1;
            }
        }
        System.out.println(v);
    }
    
    private static int timeConsume(int[] foods, int v) {
        int time = 0;
        for(int i = 0; i < foods.length; i++){
            time += (foods[i] + v - 1) / v;
        }
        return time;
    }
} def solution(p, h): i = 1 # 进食速度k while 1: count = 0 i += 1 for j in range(len(p)): if p[j] % i != 0: count = count + p[j]//i+1 else: count = count + p[j]//i if count <= h: return i if __name__ =='__main__': p = list(map(int, input().strip().split())) h = int(input().strip()) print(solution(p, h))# 方法二:利用二分查找优化
def solution2(p, k): count = 0 for j in range(len(p)): if p[j] % k != 0: count = count + p[j] // k + 1 else: count = count + p[j] // k return count if __name__ =='__main__': p = list(map(int, input().strip().split())) h = int(input().strip()) l, r = sum(p)//h, max(p) while l < r: mid = l + (r - l) // 2 count = solution2(p, mid) if count > h: l = mid+1 else: r = mid print(l)
def check(k, p, h): s = 0 for x in p: s += (x-1)//k +1 return s <= h def bs(l:int, r:int, p, h): res = -1 while l<=r: m = (l+r) // 2 if check(m, p, h): res = m r = m-1 else: l = m+1 return res p = list(map(int,input().split())) h = int(input()) print(bs(1,100000000,p,h))
#include <bits/stdc++.h>
using namespace std;
inline int solve(vector<int> &arr,int k){
    int h=0;
    for(int i=0;i<arr.size();i++){
        h+=(arr[i]+k-1)/k;
    }
    return h;
}
int binary(vector<int> &arr,int start,int end,int aim){
    int left=start,right=end;
    while(left<=right){
        int mid=left+(right-left)/2;
        int h=solve(arr,mid);
        if(h<=aim){
            if(solve(arr,mid-1)>aim)
                return mid;
            right=mid-1;
        }
        else
            left=mid+1;
    }
    return left;
}
int main(){
    int h,mink,maxk,sum=0;
    vector<int> arr;
    while(1){
        int t;
        cin>>t;
        arr.push_back(t);
        sum+=t;
        maxk=max(maxk,t);//最大进食速度
        if(cin.get()=='\n')
            break;
    }
    cin>>h;
    mink=sum/h;    //最小进食速度
    cout<<binary(arr,mink,maxk,h);
    return 0;
}
 #include <bits/stdc++.h>
using namespace std;
void read(vector<int> &v){
  int num = 0;
  char c;
  while((c = getchar()) != '\n'){
    if(c != ' '){
      num = 10 * num + c - '0';
    } else {
      v.push_back(num);
      num = 0;
    }
  }
  v.push_back(num);
}
int main(){
  vector<int> p;
  int H;
  read(p);
  scanf("%d", &H);
  int l = 0, r = 0, total = 0, res;
  for (int i : p){
    r += i;
  }
  res = r;
  while(l <= r){
    int mid = (l + r) >> 1;
    total = 0;
    for (int i : p){
      total += (i + mid - 1) / mid;
    }
    if(total <= H){
      res = min(res, mid);
      r = mid - 1;
    } else {
      l = mid + 1;
    }
  }
  cout << res << "\n";
  return 0;
} import java.util.Scanner;
import java.util.ArrayList;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        ArrayList<Integer> food=new ArrayList<>();
        while(in.hasNextInt()){
            food.add(in.nextInt());
        }
        int num=food.size()-1;
        Integer[] fo=food.toArray(new Integer[food.size()]);
        int planTime=fo[fo.length-1];
        in.close();
        int realTime=planTime+1;
        int speed;
        for(speed=1;realTime>planTime;speed++){
            realTime=0;
            for(int i=0;i<num;i++){
                if((fo[i]%speed)!=0&&fo[i]>speed){
                    realTime+=fo[i]/speed+1;
                }
                else if(fo[i]<speed)
                    realTime++;
                else
                    realTime+=fo[i]/speed;
            }
        }
        System.out.println(--speed);
    }
}
 """
暴力尝试,K从1到最大值
"""
import sys
import math
if __name__ == "__main__":
    # sys.stdin = open("input.txt", "r")
    p = list(map(int, input().strip().split()))
    H = int(input().strip())
    for K in range(1, max(p) + 1):
        temp = 0
        for a in p:
            temp += math.ceil(a / K)
        if temp <= H:
            break
    print(K)
	
 #include <bits/stdc++.h>
using namespace std;
vector<int> arr;
int H, tmp, sum = 0, mmax = 0, res, mmin; 
bool solve(int x, int H) {
	int res = 0;
	for(int i = 0; i < arr.size(); i++) {
		res += (arr[i] % x == 0) ? arr[i] / x: arr[i] / x + 1;
	}
	return res <= H;
}
int main() {
    string line; getline(cin, line);
    istringstream iss(line);
    while(iss >> tmp) {
        arr.push_back(tmp);
		mmax = max(mmax, tmp);
		sum += tmp;
    }
    scanf("\n%d", &H);
	mmin = (sum % H == 0) ? sum / H: sum / H + 1;
	while(mmin < mmax) {
		res = (mmin + mmax) / 2;
		if(solve(res, H)) mmax = res;//满足条件时 将右边届设为中间值
		else mmin = res + 1;
		if(solve(mmin, H)) break;//左边界满足时 终止
	}
	cout<<mmin<<endl;//结果为左边界
}
/*
3 6 7 11
8
*/ 二分查找加快速度
import java.util.Scanner;
import static java.lang.System.in;
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(in);
        String[] str = sc.nextLine().split(" ");
        int h = Integer.parseInt(sc.nextLine());
        int[] data = new int[str.length];
        int maxSpeed = Integer.MIN_VALUE;
        for (int i = 0; i < str.length; i++) {
            data[i] = Integer.parseInt(str[i]);
            maxSpeed = Math.max(maxSpeed, data[i]);
        }
        int mid = 0;
        int minSpeed = 1;
        while (minSpeed <= maxSpeed) {
            mid = minSpeed + ((maxSpeed - minSpeed) >> 1);
            if (getHour(data, mid) <= h) {
                maxSpeed = mid - 1;
            } else {
                minSpeed = mid + 1;
            }
        }
       System.out.println(minSpeed);
    }
    public static int getHour(int[] data, int k) {
        int sum = 0;
        for (int i = 0; i < data.length; i++) {
            sum += data[i] % k == 0 ? data[i] / k : data[i] / k + 1;
        }
        return sum;
    }
}
                                                                                    import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Solution3_爱吃猫粮的小招喵 {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String[] line1 = bf.readLine().split(" ");
        int n = line1.length;
        int h = Integer.parseInt(bf.readLine());
        int[] nums = new int[n];
        int total = 0;
        for (int i = 0; i < n; i++) {
            nums[i] = Integer.parseInt(line1[i]);
            total += nums[i];
        }
        int k  = total / h;//总的猫粮总量除以时间,至少每小时吃的猫粮数量
        while (costTime(nums, k) > h) {
            k++;
        }
        System.out.println(k);
    }
    private static int costTime(int[] nums, int k) {
        int total_h = 0;//吃完猫粮花费的时间
        for (int i = 0; i < nums.length; i++) {
            total_h += (nums[i] + k - 1) / k; //向上取整,eg: k = 4,nums[i]=5,则需要两个小时
        }
        return total_h;
    }
}
                                                                                    #include <iostream>
#include<set>
#include<map>
#include<vector>
#include<algorithm>
#include<math.h>
//#include<
using namespace std;
int main()
{
    vector<int> nums;
    int num;
    while(cin>>num)
    {
        nums.push_back(num);
        if(cin.get() == '\n')
            break;
    }
    int hour;
    cin>>hour;
    int speed = 1;
    while(1)
    {
        int need_time = 0;
        for(int i = 0;i<nums.size();i++)
        {
            if(nums[i] % speed == 0)
                need_time += nums[i]/speed;
            else {
                need_time += nums[i]/speed + 1;
            }
        }
        if(need_time <= hour)
        {
            cout<<speed<<endl;
            break;
        }else {
            speed++;
        }
    }
    return 0;
}
 // 二分查找!// 理论最小进食速度: 所有喵粮求和 / 给定的小时数// 理论最大进食速度:最大堆的喵粮数// 在这两个之间二分查找最小实际可行进食速度即可// 注:这是一个lower_bound的二分问题,即求最左边满足条件的值 需要相应修改二分查找代码#include <bits/stdc++.h> using namespace std; vector<int> arr; int H, tmp, sum = 0, mmax = 0, res, mmin; bool solve(int x, int H) { int res = 0; for(int i = 0; i < arr.size(); i++) { res += (arr[i] % x == 0) ? arr[i] / x: arr[i] / x + 1; } return res <= H; } int main() { string line; getline(cin, line); istringstream iss(line); while(iss >> tmp) { arr.push_back(tmp); mmax = max(mmax, tmp); sum += tmp; } scanf("\n%d", &H); mmin = (sum % H == 0) ? sum / H: sum / H + 1; while(mmin < mmax) { res = (mmin + mmax) / 2; if(solve(res, H)) mmax = res;//满足条件时 将右边届设为中间值 else mmin = res + 1; if(solve(mmin, H)) break;//左边界满足时 终止 } cout<<mmin<<endl;//结果为左边界 }
import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String in = sc.nextLine();
        int n = sc.nextInt();
        String[] s = in.split(" ");
        int[] array = new int[s.length];
        for (int i = 0; i < s.length; i++) {
            array[i] = Integer.parseInt(s[i]);
        }
        sc.close();
        for (int i = 1; i < Integer.MAX_VALUE; i++) {
            int sum = 0;
            for (int j = 0; j < array.length; j++) {
                if (sum > n) {
                    break;
                }
                sum += array[j] / i;
                if (array[j] % i != 0) {
                    sum++;
                }
            }
            if (sum <= n) {
                System.out.println(i);
                break;
            }
        }
    }
} import sys in_list = [int(i) for i in sys.stdin.readline().strip().split()] num = int(sys.stdin.readline().strip()) left = sum(in_list)//num right = max(in_list) for i in range(left,right+1): res = 0 for j in in_list: if j%i == 0: res+=(j//i) else: res+=(j//i)+1 if res<=num: print(i) break