# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1216889 | lukasuliashvili | Rice Hub (IOI11_ricehub) | C++20 | 0 ms | 0 KiB |
#include "ricehub.h"
#include <bits/stdc++.h>
#define int long long
using namespace std;
bool can(int k, int R, long long B, const vector<int>& X, const vector<int>& prefix) {
for (int i = 0; i + k - 1 < R; i++) {
int j = i + k - 1;
int mid = (i + j) / 2;
int leftSum = (mid > 0 ? prefix[mid - 1] : 0) - (i > 0 ? prefix[i - 1] : 0);
int rightSum = prefix[j] - prefix[mid];
int leftCount = mid - i;
int rightCount = j - mid;
int leftCost = X[mid] * leftCount - leftSum;
int rightCost = rightSum - X[mid] * rightCount;
int totalCost = leftCost + rightCost;
if (totalCost <= B)
return true;
}
return false;
}
int besthub(int R, int L, int X_raw[], long long B) {
vector<int> X(X_raw, X_raw + R);
sort(X.begin(), X.end());
vector<int> prefix(R);
prefix[0] = X[0];
for (int i = 1; i < R; i++) {
prefix[i] = prefix[i - 1] + X[i];
}
int low = 1, high = R, best = 0;
while (low <= high) {
int mid = (low + high) / 2;
if (can(mid, R, B, X, prefix)) {
best = mid;
low = mid + 1;
} else {
high = mid - 1;
}
}
return best;
}