栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

二进制数组三等分

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

二进制数组三等分

文章目录
    • 1. 描述
    • 2. 代码

1. 描述

二进制数组分割, 分割成三等份, 返回下标

2. 代码
#include 
#include 
#include 

using namespace std;

vector splitArray(vector& A) {
	
	int n = A.size();
	int cnt1 = accumulate(A.begin(), A.end(), 0);
	// int cnt1 = 0;
	// for(int i = 0; i < A.size(); i++){
	// 	cnt1 += A[i];
	// }

	if (cnt1 % 3 != 0) return {-1, -1};

	if (!cnt1) return {0, 2};
	cnt1 /= 3;
	int cnt = 0, left[3], right[3];

	for (int i = 0; i < n; ++i) {
		if (!A[i]) continue;
		cnt++;
		if ((cnt-1)%cnt1 == 0) left[(cnt-1)/cnt1] = i;
		if (cnt%cnt1 == 0) right[(cnt-1)/cnt1] = i;
	}

	for (int i = 0; i < 3; ++i) {
		right[i] += n - 1 - right[2];
	}

	for (int i = 0; i <= right[0]-left[0]; ++i) {
		if (A[left[1]+i] != A[left[0]+i] || A[left[2]+i] != A[left[0]+i])
			return {-1, -1};
	}

	return {right[0], right[1]+1};
}

int main()
{	
	vector arr{1, 0, 1, 0, 1};
	// vector arr{1, 1, 0, 1, 1};

	// int n;
	// vector arr;
	// while(cin >> n){
	// 	arr.push_back(n);
	// 	if(cin.get() == 'n') break; // ADD
	// }

	vector res = splitArray(arr);

	for(int i=0; i < res.size() - 1; i++){
		cout << res[i] << ",";
	}

	cout << res[res.size() - 1];

	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/629409.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号