试题 算法训练 娜神平衡(二进制枚举)
二进制枚举点这里
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】