题目大意:
爱丽丝和鲍勃正在一个矩阵上玩游戏,包括2行和m列。
最初,爱丽丝和鲍勃都站在(1,1).他们将走到(2,m).
只能向下或向右走
首先,爱丽丝做她所有的动作,直到她达到(2,m).她收集她访问的所有格子中的硬币(包括初末单元)。
当爱丽丝结束,鲍勃开始他的旅程。他还执行移动到达(2,m)并在他访问的所有各种收集硬币(之前被收走硬币后的格子上金币为0)
游戏的分数是鲍勃收集的硬币总数。
爱丽丝想把比分降到最低。鲍勃想把比分最大化。如果两个玩家都发挥得最好,游戏的分数会是多少?
思路:
因为只有两行,只能向下一次,所以我们可以枚举在每一列向下走的情况,利用前缀和O(1)处理出剩下的左下和右上两条路鲍勃可以获得的金币,显然鲍勃会选多的那一条路
在所有情况中取最小值(因为爱丽丝想让他最小)
AC代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+3;
int a[3][maxn];
ll sum[3][maxn];
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i=1;i<=2;++i)
for(int j=1;j<=n;++j)
sum[i][j]=0;
for(int i=1;i<=2;++i){
for(int j=1;j<=n;++j){
scanf("%d",&a[i][j]);
sum[i][j]=sum[i][j-1]+a[i][j];
}
}
ll ans=1e9+3;
for(int i=1;i<=n;++i){
ll p=0;
if(i!=n)p=max(p,sum[1][n]-sum[1][i]);
if(i!=1)p=max(p,sum[2][i-1]);
ans=min(p,ans);
}
printf("%lld\n",ans);
}
}