【题解】CF1767B 题解
CF1767B 题解
思路分析
一道数学思维题。
首先我们发现,两个数,一个加一,一个减一。那么显然和不变。
现在我们要求 的最大值。显然,它的最大值是由操作得来的,求最大值要尽量的往上加,也就是要求每次操作 都是较小的那个,这样子它才能加。而且注意要从小到大,保证单调性,不然取不到最大。这个很容易实现,把除 的数排序后遍历比 大的数就可以了。
然后我们就要思考: 每次到底最多能变为什么呢?注意:每次操作都要满足 是较小的那个,而且和不变。设当前要与 操作的数为 那么 就最多变为 ,注意向上取整(不用担心较小条件的问题,因为操作本来就是要变为较大的)。
按照那个公式排序并计算即可。注意:多测不清空,爆零两行泪。
关键代码
void solve(int x) // x 为 a1
{
// 备注:a 已经按从小到大把 a2 到 an 排序
int t = x;
for(int i = 2;i <= n;i++)
{
if(a[i] > x)
{
t = ceil((a[i] + t) / 2.0); // 按照公式计算
}
}
cout << t << endl;
}

浙公网安备 33010602011771号