【题解】CF1788A 题解

CF1788A 题解

思路分析

简单前缀和的题。

直接乘会爆。

观察到数组由 1122 组成,而题目要求乘起来。由于 11 不影响乘积的结果,于是乘积结果看 22 的个数即可。

但是直接统计又会爆掉。注意到题面的乘积是连续的,于是可以开个前缀和数组 sumsumsumisum_i 记录数组中前 ii 个数中含有多少个 22

之后遍历 22n1n-1(第一项和最后一项显然不满足要求)。若 sumi=sumnsumisum_i = sum_n-sum_i,输出并退出程序。若全部遍历完程序仍未退出,则代表未找到,输出 1-1

关键代码

void solve()
{
	int n;
	cin >> n;
	memset(a, 0x0, sizeof(a)); //多测不清空,爆零两行泪
	for(int i = 1;i <= n;i++)
	{
		cin >> a[i];
		if(a[i] == 2) sum[i] = sum[i - 1] + 1; //如果是二,统计
		else sum[i] = sum[i - 1];
	}
	for(int i = 2;i < n;i++)
	{
		if(sum[i] == sum[n] - sum[i]) //如果符合要求
		{
			cout << i << endl; //输出并退出程序
			return;
		}
	}
	cout << -1 << endl; //找不到,输出 -1
}
posted @ 2023-08-16 12:12  邻补角-SSA  阅读(16)  评论(0)    收藏  举报  来源