专栏文章

题解:P11035 【MX-X3-T2】「RiOI-4」消えた夏の夢

P11035题解参与者 6已保存评论 5

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
5 条
当前快照
1 份
快照标识符
@mins31g0
此快照首次捕获于
2025/12/02 07:26
3 个月前
此快照最后确认于
2025/12/02 07:26
3 个月前
查看原文
众所周知加法有交换律,所以打乱操作顺序对结果没有影响,所以我们可以考虑对序列 aa 中的每个数分别考虑。
对于一个数 aia_i,设 qq 为操作前的 xxbib_i 为操作前的 aia_i
一次操作:
  • xx+ai=q+bix\gets x+a_i=q+b_i
  • aiai=bia_i\gets-a_i=-b_i
两次操作:
  • xx+ai=q+bi+(bi)=qx\gets x+a_i=q+b_i+(-b_i)=q
  • aiai=(bi)=bia_i\gets-a_i=-(-b_i)=b_i
所以,两次操作相当于不操作。所以,对于每个数,我们只需要确定是否需要操作即可。
题目要求 xx 最大,而每次操作如果 aia_i 大于 00 就会变大,小于等于 00 就不会变大(如果小于 00 反而会变小)。因此,只需要在 ai>0a_i>0 的时候进行操作即可。
由于操作只进行一次,因此操作中 aia_i 的变化不会影响到后续结果,所以代码里只需要体现操作中 xx 的变化,不用写出 aia_i 的变化。
代码CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, p, x;
// 代码中的 x 相当于题目中的 a[i],p 相当于题目中的 x
void solve()
{
    cin >> n >> p;
    while (n--)
    {
        cin >> x;
        if (x > 0) // 如果大于 0 就进行操作
        {
            p += x;
        }
    }
    cout << p;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	ll t = 1;
	// cin >> t;
	while (t--)
	{
		solve();
	}
	return 0;
}

评论

5 条评论,欢迎与作者交流。

正在加载评论...