试题 算法训练 娜神平衡(二进制枚举)

二进制枚举点这里

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int N[10010], val1[10010], val2[10010];
int n, r, idx1, idx2;

bool check() {//判断每种情况是否符合题目
	int x = 0, y = 0, sum1 = 0, sum2 = 0, flag = 1;
	sum1 = val1[++x];
	while (abs(sum1 - sum2) <= r && flag) {
		flag = 0;
		if (abs(sum1 + val1[x + 1] - sum2) <= r && x + 1 <= idx1) {
			x++;
			flag = 1;
			sum1 += val1[x];
		}
		if (abs(sum1 - val2[y + 1] - sum2) <= r && y + 1 <= idx2) {
			y++;
			flag = 1;
			sum2 += val2[y];
		}
	}
	if (x == idx1 && y == idx2)
		return true;
	return false;
}

int main() {
	cin >> n >> r;
	for (int i = 0; i < n; i++)
		cin >> N[i];
	int first = N[0];
	sort(N, N + n);
	for (int i = 1; i < (1 << n) - 1; i++) {//除去两个不存在的情况
		int judge = 0;
		idx1 = idx2 = 0;
		for (int j = 0; j < n; j++) {//每一位去找是否存在
			if ((1 << j)&i)
				val1[++idx1] = N[j];
			else
				val2[++idx2] = N[j];
		}
		if (check()) {//输出
			for (int j = 1; j <= idx1; j++) {
				if (val1[j] == first)
					judge = 1;
			}
			if (judge) {
				for (int j = 1; j <= idx1; j++) {
					cout << val1[j] << ' ';
				}
				cout << endl;
				for (int j = 1; j <= idx2; j++) {
					cout << val2[j] << ' ';
				}
				cout << endl;
			} else {
				for (int j = 1; j <= idx2; j++) {
					cout << val2[j] << ' ';
				}
				cout << endl;
				for (int j = 1; j <= idx1; j++) {
					cout << val1[j] << ' ';
				}
				cout << endl;
			}
			break;
		}
	}
	return 0;
}
posted @   帝宝单推人!  阅读(365)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示