AtCoder Regular Contest 144

B - Gift Tax

https://atcoder.jp/contests/arc144/tasks/arc144_b

Time Limit: 2 sec / Memory Limit: 1024 MB

Score : 400 points

Problem Statement

You are given positive integers aa and bb such that ab, and a sequence of positive integers A=(A1,A2,,AN).

On this sequence, you can perform the following operation any number of times (possibly zero):

  • Choose distinct indices i,j (1i,jN). Add a to Ai and subtract b from Aj.

Find the maximum possible value of min(A1,A2,,AN) after your operations.

Constraints

  • 2N3×105
  • 1ab109
  • 1Ai109

Input

Input is given from Standard Input in the following format:

N a b
A1 A2 AN

Output

Print the maximum possible value of min(A1,A2,,AN) after your operations.


Sample Input 1

3 2 2
1 5 9

Sample Output 1

5

Here is one way to achieve min(A1,A2,A3)=5.

  • Perform the operation with i=1,j=3. A becomes (3,5,7).
  • Perform the operation with i=1,j=3. A becomes (5,5,5).

Sample Input 2

3 2 3
11 1 2

Sample Output 2

3

Here is one way to achieve min(A1,A2,A3)=3.

  • Perform the operation with i=1,j=3. A becomes (13,1,1).
  • Perform the operation with i=2,j=1. A becomes (10,3,1).
  • Perform the operation with i=3,j=1. A becomes (7,3,1).
  • Perform the operation with i=3,j=1. A becomes (4,3,3).

Sample Input 3

3 1 100
8 5 6

Sample Output 3

5

You can achieve min(A1,A2,A3)=5 by not performing the operation at all.


Sample Input 4

6 123 321
10 100 1000 10000 100000 1000000

Sample Output 4

90688

解题笔记

最开始用模拟写了遍,理所当然超时了,然后就不会做了(太久没练又退化了

这题是用二分来解决,在 1109 的区间二分找到最大的 C,使进行若干次操作后的 A[i]C (0i<N),这个 C 便是答案。

那么如何判断进行若干次操作后,A[i] 是否能够满足 A[i]C (0i<N)

可以遍历 A[i]

A[i]C,那么它可以减去 (A[i]C)/bb,仍能保持 A[i]C

A[i]<C,那么它需要加上 (CA[i])/aa,才能达成 A[i]C

若所有的减去的 b 的数量大于等于加上的 a 的数量,那么说明进行若干次操作,能够满足 A[i]C (0i<N)

代码

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int MAXN = 3e5 + 20;
int N, a, b;
int A[MAXN];

bool ok(int n)
{
    int x = 0, y = 0;
    for (int i = 0; i < N; i++)
    {
        if (A[i] >= n)
            x += (A[i] - n) / b;
        else
            y += ceil(1.0 * (n - A[i]) / a);
    }
    return x >= y;
}

signed main()
{
    cin >> N >> a >> b;
    for (int i = 0; i < N; i++)
        cin >> A[i];
    int l = 0, r = INT32_MAX;
    while (l < r)
    {
        int mid = (l + r) / 2;
        if (ok(mid))
            l = mid + 1;
        else
            r = mid;
    }
    cout << l - 1 << endl;
    return 0;
}