题解:CF2124B Minimise Sum
此题是求前缀最小值,所以从位置靠前的元素开始考虑。比如说只考虑前三个元素即可。
当 \(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;
}
感谢阅读。
本文来自博客园,作者:Circle_Table,转载请注明原文链接:https://www.cnblogs.com/Circle-Table/articles/19177417

浙公网安备 33010602011771号