Problem Description
度度熊很喜欢数组!!我们称一个整数数组为稳定的,若且唯若其同时符合以下两个条件:1. 数组里面的元素都是非负整数。2. 数组里面最大的元素跟最小的元素的差值不超过 。举例而言, 是稳定的,而 跟 都不是。现在,定义一个在整数数组进行的操作:* 选择数组中两个不同的元素 以及 ,将 减去 ,以及将 加上 。举例而言, 经过一次操作后,有可能变为 或 。现在给定一个整数数组,在任意进行操作后,请问在所有可能达到的稳定数组中,拥有最大的『数组中的最小值』的那些数组,此值是多少呢?
Input
输入的第一行有一个正整数 ,代表接下来有几组测试数据。对于每组测试数据:第一行有一个正整数 。接下来的一行有 个非负整数 ,代表给定的数组。* * * * 至多 组测试数据中的
Output
对于每一组测试数据,请依序各自在一行内输出一个整数,代表可能到达的平衡状态中最大的『数组中的最小值』,如果无法达成平衡状态,则输出 。
Sample Input
2
3
1 2 4
2
0 100000000
Sample Output
2
33333333
AC
- 一定可以达成稳定状态,二分枚举答案求满足稳定状态的最最小值的最大化
#include <iostream>
#include <stdio.h>
#include <map>
#include <vector>
#include <queue>
#include <algorithm>
#include <cmath>
#define N 300005
#define ll long long
#define P pair<int, int>
#define mk make_pair
using namespace std;
int a[N];
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int t;
scanf("%d", &t);
while (t--) {
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
int l = 0, r = 1e8;
while (l <= r) {
int mid = (l + r) >> 1;
ll sum = 0;
for (int i = 0; i < n; ++i) {
// 统计需要减2的个数
if (a[i] > mid) sum -= (a[i] - mid) / 2;
// 统计需要加2的个数
else sum += mid - a[i];
}
// 如果sum大于0,mid偏大
if (sum > 0) r = mid - 1;
// 如果sum小于0,mid偏小
else l = mid + 1;
}
printf("%d\n", r);
}
return 0;
}