题目 | Gift Tax
AtCoder Regular Contest 144
B - Gift Tax
https://atcoder.jp/contests/arc144/tasks/arc144_b
Time Limit: 2 sec / Memory Limit: 1024 MB
Score :
Problem Statement
You are given positive integers aa and bb such that
On this sequence, you can perform the following operation any number of times (possibly zero):
- Choose distinct indices
( ). Add to and subtract from .
Find the maximum possible value of
Constraints
Input
Input is given from Standard Input in the following format:
Output
Print the maximum possible value of
Sample Input 1
3 2 2
1 5 9
Sample Output 1
5
Here is one way to achieve
- Perform the operation with
. becomes . - Perform the operation with
. becomes .
Sample Input 2
3 2 3
11 1 2
Sample Output 2
3
Here is one way to achieve
- Perform the operation with
. becomes . - Perform the operation with
. becomes . - Perform the operation with
. becomes . - Perform the operation with
. becomes .
Sample Input 3
3 1 100
8 5 6
Sample Output 3
5
You can achieve
Sample Input 4
6 123 321
10 100 1000 10000 100000 1000000
Sample Output 4
90688
解题笔记
最开始用模拟写了遍,理所当然超时了,然后就不会做了(太久没练又退化了
这题是用二分来解决,在
那么如何判断进行若干次操作后,
可以遍历
若
若
若所有的减去的
代码
#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;
}
本文采用 CC BY-SA 4.0 许可,本文 Markdown 源码:Haotian-BiJi