CF-Round #640-div4-D题
D. Alice, Bob and Candies
这道题就是模拟+双指针~
首次见到div4的场,最后看standings的时候,我去,有人名字直接从青直接变蓝了=-=
太久没有写题了,最近忙着剪视频啥的了,害~
题目大意:Alice和Bob在比赛吃糖果,有n堆糖果摆成一排,Alice和Bob分别从左边和右边开始吃糖果,规定女士优先,Alice先开始吃糖果,每次吃的糖果要比对方前一次吃的糖果要多。如果剩下所有糖果的数量还是比对方上一次吃的糖果少,那么要把剩下的糖果吃完,糖果吃完代表游戏结束。问最终游戏Alice和Bob一共进行了几次移动,并且分别吃的糖果的数目有多少。输出
本题思路:这道题就是模拟游戏过程,l记录Alice当前的位置,r记录Bob当前的位置;ansl记录Alice吃的糖果总数,ansr记录Bob吃的糖果总数;suml记录Alice当前轮吃的糖果数,sumr记录Bob当前轮吃的糖果数;cnt记录到了哪一轮。
于是这样模拟下去就行了~(只要l <= r都可以进行下去)
这是一个O(N)的写法嘻嘻。
代码部分:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++)
{
scanf ("%d", &a[i]);
}
int l = 0, r = n - 1;
int suml = 0, sumr = 0;
int cnt = 0, ansl = 0, ansr = 0;
while (l <= r)
{
if (!(cnt & 1))
{
int t = 0;
while (l <= r && t <= sumr)
{
t += a[l++];
}
ansl += t;
suml = t;
}
else
{
int t = 0;
while (l <= r && t <= suml)
{
t += a[r--];
}
ansr += t;
sumr = t;
}
cnt++;
}
cout << cnt << " " << ansl << " " << ansr << endl;
}
return 0;
}