题解:CF2124B Minimise Sum

洛谷题目传送门
Codeforces题目传送门

此题是求前缀最小值,所以从位置靠前的元素开始考虑。比如说只考虑前三个元素即可。

\(a_1<a_2\) 时,易知 \(\min(a_1)\)\(\min(a_1, a_2)\) 均为 \(a_1\) 的值。由此可见 \(a_2\) 的值不会影响这两个东西,所以和样例中第二组数据一样,在 \(i=2,j=3\) 时操作。然后有 \(a_3=0\) 成为后面所有元素的前缀最小值。故答案为 \(\min(a_1)+\min(a_1, a_2)+0+0+\cdots=2a_1\)

\(a_1>a_2\) 时,不妨直接在 \(i=1,j=2\) 时操作。得到 \(a_1 \gets a_1+a_2\) 之后,从 \(a_2=0\) 后面所有元素的前缀最小值都成了它。故答案为 \(\min(a_1)+0+0+0+\cdots=a_1+a_2\)

\(a_1=a_2\) 时,上面两个式子的值实际上是一样的。因为随便要输出哪个都可以。这样说完思路大体也就清晰了。

代码如下

#include<bits/stdc++.h>
#define ri register int
#define ios ios::sync_with_stdio,cin.tie(0),cout.tie(0)
using namespace std;
const int N=200005;
int T,n,a[N],ans;
signed main()
{
	ios;cin>>T;
	while(T--)
	{
		cin>>n;
		for(ri i=1;i<=n;i++)
		{
			cin>>a[i];
		}
		if(a[1]<=a[2])ans=2*a[1];
		else ans=a[1]+a[2];
		cout<<ans<<'\n';
	}
	return 0;
}


感谢阅读。

posted @ 2025-10-30 16:15  Circle_Table  阅读(4)  评论(0)    收藏  举报