当前位置: 首页 > news >正文

题解:CF859C Pie Rules

Luogu - CF859C

Analysis

由题意知每个人选择时都是以最佳情况来选,最佳情况是指他的选择能使后面拿的更多。所以决定最佳情况是来自后面。

还有一个重要性质,不管是 Bob 还是 Alice,只要是拥有决策权的人面对同一个局面,其得到的最大得分一定相等。这样,我们找到了固定状态,就可以 dp 了。

因为我们管的是从某个位置往后面取的最大值,所以可以找某一个位置 i i i n n n 的值。

f ( i , n ) f(i,n) f(i,n) 表示 i ∼ n i \sim n in 区间里,选到 i i i 时,先手取的最大值。 a a a 数组存储原序列, s u m i , j sum_{i,j} sumi,j 表示 a i ∼ a j a_i \sim a_j aiaj 的和。

分两种情况:

  1. 他要拿的当前的数。相当于增加收益,但把选择权给了对方。转移到 s u m i + 1 , n − f ( i + 1 , n ) + a i sum_{i+1,n}-f(i+1,n)+a_i sumi+1,nf(i+1,n)+ai
    意思是 [ i + 1 , n ] [i+1,n] [i+1,n] 区间的和,减去后面的人可以取到的最大值,再加上当前可以拿的 a i a_i ai

  2. 他选当前的数,选后面的。相当于放弃了收益,但保留选择权。转移到 f ( i + 1 , n ) f(i+1,n) f(i+1,n)

发现 f f f 函数第二个参数都是 n n n,可以省略。

于是,设 f [ i ] f[i] f[i] 表示先手面对 i ∼ n i \sim n in 时,可以取到的最大值。
我们只需将两种情况的最大值,赋值给 f i f_i fi 即可:
f i = max ⁡ { f i + 1 , s u m i + 1 , n − f i + 1 + a i } f_i=\max\{f_{i+1},\ sum_{i+1,n}-f_{i+1}+a_i\} fi=max{fi+1, sumi+1,nfi+1+ai}

我们知道第一个选的是 Bob,所以 Bob 得到的就是 f 1 f_1 f1,Alice 得到的就是 Bob 剩下的,即 s u m 1 , n − f 1 sum_{1,n}-f_1 sum1,nf1

Code

考虑倒序 dp。注意 a i a_i ai 的范围是 1 0 6 10^6 106,不开 long long 必然会炸。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;void solve()
{int n;cin >> n;vector <int> a(n + 1); // 原始数组vector <ll> s(n + 1); // 前缀和数组,a[i]<=1e6,开long long!vector <ll> f(n + 2); // dp数组,long longfor(int i = 1; i <= n; i ++){cin >> a[i];s[i] = s[i - 1] + a[i];}for(int i = n; i >= 1; i --){ // 倒推f[i] = max(f[i + 1], (s[n] - s[i]/*i+1~n区间和*/) - f[i + 1] + a[i]);}cout << s[n] - f[1] << ' ' << f[1] << endl;
}signed main()
{ios :: sync_with_stdio(false), cin.tie(0), cout.tie(0);solve();return 0;
}

End

这里是 YLCHUP,谢谢大家!

相关文章:

  • tcpdump源码分析
  • Python数据分析实验四:数据分析综合应用开发
  • AWS安全性身份和合规性之IAM Identity Center(AWS Single Sign-On)
  • 民国漫画杂志《时代漫画》第13期.PDF
  • AI早班车5.25
  • 【EXCEL_VBA_基础知识】10 使用Dir函数合并多个文件数据
  • python冰雹序列的探索与编程实现
  • Restful API设计与使用:介绍什么是RESTful架构,以及如何在Spring Boot中设计和实现Restful API
  • Mybatis源码剖析---第二讲
  • 【Java面试】一、Redis篇(上)
  • 链表-设计LRU缓存结构
  • uni-app App端实现文字语音播报(Ba-TTS)
  • PTA 6-4 配对问题
  • 如何参与github开源项目并提交PR
  • Linux下环境变量配置出错导致基础命令使用不了的问题解决
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【刷算法】求1+2+3+...+n
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • CentOS6 编译安装 redis-3.2.3
  • Hibernate最全面试题
  • in typeof instanceof ===这些运算符有什么作用
  • js操作时间(持续更新)
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • React-Native - 收藏集 - 掘金
  • RxJS: 简单入门
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 从输入URL到页面加载发生了什么
  • 分布式熔断降级平台aegis
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 时间复杂度与空间复杂度分析
  • 使用API自动生成工具优化前端工作流
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 怎样选择前端框架
  • 转载:[译] 内容加速黑科技趣谈
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • !!Dom4j 学习笔记
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (02)Hive SQL编译成MapReduce任务的过程
  • (7) cmake 编译C++程序(二)
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (转)C#调用WebService 基础
  • (转)ORM
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .aanva
  • .net 7和core版 SignalR
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Core 发展历程和版本迭代