Cod sursa(job #3287120)

Utilizator lucky1992Ion Ion lucky1992 Data 15 martie 2025 22:36:03
Problema Transport Scor 100
Compilator java Status done
Runda Arhiva de probleme Marime 2.4 kb
import java.io.*;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {

  public static class MyScanner implements Closeable {
    BufferedReader br;
    StringTokenizer st;

    public MyScanner(String file) throws FileNotFoundException {
      br = new BufferedReader(new InputStreamReader(new FileInputStream(file)), 1 << 16);
    }

    String next() {
      while (st == null || !st.hasMoreElements()) {
        try {
          st = new StringTokenizer(br.readLine());
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      return st.nextToken();
    }

    int nextInt() {
      return Integer.parseInt(next());
    }

    long nextLong() {
      return Long.parseLong(next());
    }

    double nextDouble() {
      return Double.parseDouble(next());
    }

    String nextLine(){
      String str = "";
      try {
        str = br.readLine();
      } catch (IOException e) {
        e.printStackTrace();
      }
      return str;
    }

    @Override
    public void close() throws IOException {
      br.close();
    }
  }

  public static int checkCapacity(int[] v, int totalCapacity, int k) {
    int kk = 1;
    int currentCapacity = v[1];
    for (int i = 2; i < v.length; i++) {
      if (currentCapacity + v[i] > totalCapacity) {
        kk++;
        currentCapacity = v[i];
      } else {
        currentCapacity += v[i];
      }

      if (kk > k) {
        return kk;
      }

    }
    return kk;
  }

  public static int binarySearch(int[] v, int low, int high, int k) {
    int mid, res = -1;
    while (low <= high) {
      mid = (low + high) >>> 1;

      int nrTransport = checkCapacity(v, mid, k);
      if (nrTransport <= k) {
        res = mid;
        high = mid - 1;
      } else { // k < nrTransport
        low = mid + 1;
      }
    }
    return res;
  }

  public static void main(String[] args) throws IOException {
    try (MyScanner scanner = new MyScanner("transport.in");
         PrintWriter pw = new PrintWriter(new FileOutputStream("transport.out"))) {
      int N = scanner.nextInt();
      int k = scanner.nextInt();

      int[] v = new int[N+1];

      int min = Integer.MIN_VALUE;
      int max = 0;
      for (int i = 1; i <= N; i++) {
        v[i] = scanner.nextInt();
        max += v[i];
        if (v[i] >= min) {
          min = v[i];
        }
      }

      //int max = 16000 * N;

      pw.println(binarySearch(v, min, max, k));

    }
  }
}