> 文档中心 > CF1555C 题解

CF1555C 题解


 原文

作为直到最后才勉强通过的蒟蒻,在这里发篇题解记录一下我的想法。

悲伤了,卡点过水题

原题链接

题意解释

题目的意思,大概是这样的:

有一个 22 × mm 的矩阵。

Alice 和 Bob 都在矩阵上的 (1,1)(1,1) 处。 Alice 先出发,每到一个房间就会将这个房间所有的 coins 全部都拿走,她很聪明(她总是很聪明),会用最聪明的走法,使得在她拿走她经过路径上的所有 coins 之后,让 Bob 接下来走的时候拿的最大的 coins 总和最小。而 Bob 也非常的聪明(他也总是很聪明),会在 Alice 走后,选取一条路径可以使得他在剩下的 coins 拿走最大的总和。

注意:每一次他们都只能往右和往下走一步

输出在他们两个人都很聪明的情况下 Bob 最后的得分。

关键点

曾经有一位巨佬说过,做题,需要找到题目的关键点。

所以我们先来看一下,这道题目中的一线关键点:

  • Alice 和 Bob 都很聪明 (这是重点,着重关注)
  • 每一次他们都只能往右和往下走一步
  • 一个 22 × mm 的矩阵

第一个关键点给我们带来的是,答案一定是最优解 (fake几句) 。
第二个关键点给我们的信息是一旦 Alice 和 Bob 下去以后,就不能上来了 。 第三个关键点提示我们,这其实是一道水题

画图找解法

接下来我们采用画图的方式,找到答案.
绿色是 Alice 走的路径

感谢@QueenSi的画图助力

我相信大家已经从图中发现了, Alice 从哪个位置下去就决定了她所走的路径,也就决定了 Bob 能得到的 coins 最大的总和。

由于 Bob 与 Alice 的路径限制条件一样,且矩阵高为 22,所以我们就会发现图中红色部分蓝色部分就是出现 Bob 能得到 coins 最大的总和的唯一的两个区域。

那么一切就都已经出来了,接下来,附上代码,完事!

CODE

#include#define int long longusing namespace std;const int maxn=1e5+1e3;int T,m;int a[maxn],b[maxn],ans[maxn],sum1,sum2,answer;inline int read(){    int res=0,f=1;char c;    for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;    for(;isdigit(c);c=getchar()) res=(res<<1)+(res<<3)+(c^48);    return res*f;}signed main(){    T=read();    while(T--)    { memset(ans,0,sizeof ans); //初始化ans值  answer=0x3f3f3f3f,sum1=0,sum2=0;//将ans赋值为0x3f3f3f3f,方便后面取min //sum1记录在i位置下去时上方红色部分总和 //sum2记录在i位置下去时下方蓝色部分总和  m=read(); for(int i=1;i<=m;i++) a[i]=read(),sum1+=a[i];//提前处理好第一排总和  for(int i=1;i<=m;i++) {     b[i]=read();     sum1-=a[i];//由上面图可知,红色部分从i+1开始      ans[i]=max(sum1,sum2);//取蓝色部分和红色部分中的大值(Bob的聪明)      answer=min(ans[i],answer);//取所有蓝色部分和红色部分中的大值中的最小值(Alice的聪明)      sum2+=b[i];// 由上面图可知,蓝色部分到i-1结束  } printf("%lld\n",answer);//最后输出answer,完事     }    return 0;}