fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int main() {
  5. long long N, M, A[100001];
  6. while(cin >> N >> M) {
  7. long long total = 0;
  8. for(int i = 0; i < N; i++) {
  9. cin >> A[i];
  10. total += A[i];
  11. }
  12. if(total < M) {
  13. cout << -1 << endl;
  14. continue;
  15. }
  16. sort(A, A+M, greater<int>());
  17. int lo = 0, hi = 1000000, mid;
  18. while(hi > lo) {
  19. mid = (lo+hi+1)/2;
  20. // cout << lo << " " << mid << " " << hi << " ";
  21. long long kayu = 0LL;
  22. for(int i = 0; i < N; i++)
  23. if(mid <= A[i])
  24. kayu += A[i]-mid;
  25. // cout << kayu << endl;
  26. if(kayu >= M)
  27. lo = mid;
  28. else
  29. hi = mid-1;
  30. }
  31. cout << lo << endl;
  32. }
  33. return 0;
  34. }
  35.  
  36. /*
  37. potong(X) = banyak kayu yang didapat klo
  38.   dipotong di ketinggian X
  39. potong(X) > potong(X+1) (decreasing)
  40. yang dicari adalah nilai X sedemikian sehingga:
  41. potong(X) >= M && potong(X+1) < M
  42.  
  43. binser untuk nilai X
  44.   cek dari masing2 pohon dapat berapa kayu, jumlahkan
  45.  
  46. O(log(Ai) * log(N))
  47.  
  48. */
Success #stdin #stdout 0s 5320KB
stdin
10 25
4 2 9 9 5 3 6 7 2 10
5 5
2 7 2 9 5
5 25
2 7 2 9 5
5 125
2 7 2 9 5
stdout
3
5
1
-1