专栏文章

题解:CF859C Pie Rules^_^

CF859C题解参与者 2已保存评论 1

文章操作

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

当前评论
1 条
当前快照
1 份
快照标识符
@miqqztk1
此快照首次捕获于
2025/12/04 09:19
3 个月前
此快照最后确认于
2025/12/04 09:19
3 个月前
查看原文
思路:
容易发现 Bob 得分一定比 Alice 高,所以我们只需要考虑当 Alice 用最优策略时 Bob 的最高得分,Alice 的得分就是总数减去 Bob 的得分。
思考什么情况下会给对方,什么情况下会给自己。
根据样例分析:
CPP
3
141 592 653
若 Bob 把 141141 给到 Alice,那么他也会把 592592 给 Alice,因为他选 653653 比选 592592 更优。但即便如此,Alice 得到了 733733,即 a1+a2a_1+a_2。所以 Bob 必须选 141141
通过以上分析,我们发现不易确定当前这一步选的在下一步是否最优,也就是有后效性,所以正难则反,设 fif_i 表示从 iinn 的最优值。
如果选这个值,那么下一个位置的决策就给了 Alice,那么 fi+1f_{i+1} 就会给 Alice。我们对于 Bob 来讲,就相当于减去了 fi+1f_{i+1},这时的 fif_i 就是第 ii 个数到第 nn 个数的和,所以再维护一个前缀和就行了。
如果不选这个值,那么就等于 fi+1f_{i+1}
bib_i 表示从 iinn 的后缀和,则状态转移方程为:
fi=max(fi+1,bifi+1)f_i=\max(f_{i+1},b_i-f_{i+1})
AC Code
CPP
#include<bits/stdc++.h>
using namespace std;
int n,a[55],sum[55],f[55];
int main() {
	cin>>n;
	for(int i=1; i<=n; i++) cin>>a[i];
	for(int i=n; i>=1; i--) sum[i]=sum[i+1]+a[i];
	for(int i=n; i>=1; i--) f[i]=max(f[i+1],sum[i+1]-f[i+1]+a[i]);
	cout<<sum[1]-f[1]<<' '<<f[1];
	return 0;
}

评论

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

正在加载评论...