PKU 3104 Drying

  • 答えの値で二分探索を行った
  • 初めkの値の意味を取り違えており、毎ターンk+1乾燥させるようにしていた。WA
  • 入力の直後に--kしたら、0割りでRE
  • k==1の場合は自然乾燥させる場合と等価になるので、max_elementを返せば良い
static int a[128 * 1024];

bool check(int n, int k, int m)
{
	ll needed = 0;
	for (int i = 0; i < n; ++i) {
		int rest = a[i] - m;
		if (rest < 0) {
			rest = 0;
		}
		needed += (rest + k - 1) / k;
	}
	return needed <= m;
};

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; ++i) {
		scanf("%d", &a[i]);
	}
	int k;
	scanf("%d", &k);
	--k;

	if (k == 0) {
		cout << *max_element(a, a + n) << endl;
		return 0;
	}

	int L = 0;
	int R = 1LL << 30;
	while (L + 1 < R){
		int M = (L + R) / 2;
		if (check(n, k, M)){
			R = M;
		} else {
			L = M;
		}
	}

	cout << L + 1 << endl;
}