【题解】CF1767B 题解

CF1767B 题解

思路分析

一道数学思维题。

首先我们发现,两个数,一个加一,一个减一。那么显然和不变。

现在我们要求 a1a_1 的最大值。显然,它的最大值是由操作得来的,求最大值要尽量的往上加,也就是要求每次操作 a1a_1 都是较小的那个,这样子它才能加。而且注意要从小到大,保证单调性,不然取不到最大。这个很容易实现,把除 a1a_1 的数排序后遍历比 a1a_1 大的数就可以了。

然后我们就要思考:a1a_1 每次到底最多能变为什么呢?注意:每次操作都要满足 a1a_1 是较小的那个,而且和不变。设当前要与 a1a_1 操作的数为 axa_x 那么 a1a_1 就最多变为 a1+ax2\dfrac{a_1+a_x}{2},注意向上取整(不用担心较小条件的问题,因为操作本来就是要变为较大的)。

按照那个公式排序并计算即可。注意:多测不清空,爆零两行泪。

关键代码

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;
	
} 
posted @ 2023-01-04 19:30  邻补角-SSA  阅读(7)  评论(0)    收藏  举报  来源