Nhiệm vụ: tìm số phần tử tối đa có thể làm bằng nhau trong mảng sau khi tăng các phần tử tối đa k lần.
Ví dụ 1
Đầu vào** –
a[] = {1, 3, 8}, k = 4
Đầu ra** – 2
Giải thích** – Tăng 1 lên 4 (3 lần), tăng 3 lên 4 (1 lần) → {4, 4, 8}. 2 phần tử bằng nhau.
Ví dụ 2
Đầu vào** –
arr = {2, 5, 9}, k = 2
Đầu ra** – 0
Phương pháp
- Sắp xếp mảng tăng dần.
- Tính mảng tiền tố
p[]và mảng maxm[]. - Tìm kiếm nhị phân đáp án: với độ dài
x, kiểm tra có thể làmxphần tử bằng nhau không. - Kiểm tra: với cửa sổ kích thước
x, chi phí =x * m[j] - (p[j] - p[i])≤ k.
Ví dụ
#include <bits/stdc++.h>
using namespace std;
bool EleCal(int p[], int m[], int x, int k, int size) {
for (int i = 0, j = x; j <= size; j++, i++) {
if (x * m[j] - (p[j] - p[i]) <= k)
return true;
}
return false;
}
void Max(int arr[], int size, int k) {
sort(arr, arr + size);
int p[size + 1];
int m[size + 1];
for (int i = 0; i <= size; ++i) {
p[i] = 0;
m[i] = 0;
}
m[0] = arr[0];
p[0] = arr[0];
for (int i = 1; i < size; i++) {
p[i] = p[i - 1] + arr[i];
m[i] = max(m[i - 1], arr[i]);
}
int Lt = 1, Rt = size, result;
while (Lt < Rt) {
int mid = (Lt + Rt) / 2;
if (EleCal(p, m, mid - 1, k, size)) {
result = mid;
Lt = mid + 1;
} else
Rt = mid - 1;
}
cout << result;
}
int main() {
int a[] = { 1, 3, 8 };
int size = sizeof(a) / sizeof(a[0]);
int k = 4;
Max(a, size, k);
return 0;
}
Đầu ra
2