蒙青创五一集训模拟考入门组v2
Done
OI
Start at: 2025-5-4 8:30
3.3
hour(s)
Host:
36
#include <bits/stdc++.h>
using namespace std;
const int N = 1e7 + 50;
int a[N], f[55]; //f[i]二进制的第i位为1的下标的数的亦或和
int n;
string s;
int main() {
freopen("hamming.in","r",stdin);
freopen("hamming.out","w",stdout);
cin >> n >> s;
int t = ceil(log2(n + 1));
for (int i = 1; i <= n + t + 1; i++) {
a[i] = s[i - 1] - '0';
}
int C = 0;
for (int i = 1; i <= n; i++) {
C ^= a[i];
int tmp = i;
int cnt = 0;
while (tmp) {
cnt++;
if (tmp % 2 == 1)
f[cnt] ^= a[i];
tmp /= 2;
}
}
if (C != a[n + t + 1]) {
int res = 0;
for (int i = 1; i <= t; i++) {
res = ((f[i] ^ (a[n + i])) << (i - 1)) + res;
}
a[res] ^= 1;
}
for (int i = 1; i <= n; i++) {
cout << a[i];
}
return 0;
}
/*
f[j]背包容量为j的最大价值
f[j][k]背包容量为j能否剩下价值为k的物品
f[j][k] |= f[j-a[i]][k]
f[j][k] |= f[j-a[i]][k-a[i]]
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 505;
int n, m, a[N], f[N][N];
int main() {
freopen("backpack.in","r",stdin);
freopen("backpack.out","w",stdout);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
f[0][0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = m; j >= a[i]; j--) {
for (int k = 0; k <= j; k++) {
f[j][k] |= f[j - a[i]][k];
if (k >= a[i])
f[j][k] |= f[j - a[i]][k - a[i]];
}
}
}
for (int i = 0; i <= m; i++) {
if (f[m][i]) {
cout << i << " ";
}
}
return 0;
}
- Status
- Done
- Rule
- OI
- Problem
- 4
- Start at
- 2025-5-4 8:30
- End at
- 2025-5-4 11:50
- Duration
- 3.3 hour(s)
- Host
- Partic.
- 36