Alice, Bob and Candies(双指针)

传送门



  • 一道比较正宗的双指针题目

  • 两个人各取一边,往中间走,其实没啥好说的,思路很简单,不过细节很多,需要注意。

  • 需要5个变量,一个是最后总共有多少次move,一个是保存Alice吃了多少,一个是保存了Bob吃了多少。还有两个属于临时变量,一个保存Alice这一次吃了多少,一个保存Bob这次吃了多少,这两个变量用于比较。

#include <bits/stdc++.h>
using namespace std;

const int N = 1010;
int a[N];
bool vis[N];

void solve(){
	memset(vis, 0, sizeof vis);
	int n;
	cin >> n;
	for(int i = 1; i <= n; i ++) cin >> a[i];
	int ansa = a[1], ansb = 0, cnt = 0, i = 1, j = n + 1;
	int ta = a[1], tb = 0;
	bool flag = true;
	vis[1] = true;
	if(n == 1){
		cout << 1 << ' ' << a[1] << ' ' << 0 << endl;
		return;
	}
	ta = a[1];
	while(i < j){
		if(i + 1 == j){
			cout << cnt << ' ' << ansa << ' ' << ansb << endl;
			return;
		}
		while(ta <= tb){
			i ++;
			if(vis[i]){
				cout << cnt + 1 << ' ' << ansa << ' ' << ansb << endl;
				return;
			}
			ta += a[i];
			ansa += a[i];
			vis[i] = true;
		}
		cnt ++;
		tb = 0;
		if(j - 1 == i){
			cout << cnt << ' ' << ansa << ' ' << ansb << endl;
			return;
		}
		while(tb <= ta){
			j --;
			if(vis[j]){
				cout << cnt + 1 << ' ' << ansa << ' ' << ansb << endl;
				return;
			}
			tb += a[j];
			ansb += a[j]; 
			vis[j] = true;
		}
		cnt ++;
		ta = 0;
	}
}
int main(){
	int t;
	cin >> t;
	while(t --){
		solve();
	}
	
	return 0;
} 
原文地址:https://www.cnblogs.com/pureayu/p/14415494.html