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

二进制枚举点这里

#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 @ 2022-02-08 17:32  帝宝单推人!  阅读(376)  评论(0)    收藏  举报