1.宝物筛选
这道题是一道多重背包的问题,但是直接写模板会超时,所以采用二进制优化的原理进行优化。
代码:
#include <bits/stdc++.h>
using namespace std;
int n, m, ans, cnt = 1;
int f[1000005];
int w[1000005], v[1000005];
int main()
{
int a, b, c;
cin >> n >> m;
for (int i = 1; i <= n; ++i)
{
cin >> a >> b >> c;
for (int j = 1; j <= c; j <<= 1)
{
v[++cnt] = j * a, w[cnt] = j * b;
c -= j;
}
if (c) v[++cnt] = a * c, w[cnt] = b * c;
}
for (int i = 1; i <= cnt; ++i)
for (int j = m; j >= w[i]; --j)
f[j] = max(f[j], f[j - w[i]] + v[i]);
cout << f[m] << endl;
return 0;
}
2.尴尬的数字
思路就是枚举所有可能的错误情况,枚举二进制数中是哪一位错了,求出之后再与三进制数比较,相等的那个就是我们要找的。
代码:
#include<bits/stdc++.h>
using namespace std;
long long ans2, ans3;
int map2[1000], map3[1000], l2, l3;
char t[1000];
int main()
{
cin >> t;
for (int i = 0; i < strlen(t); i++)
t[i] -= '0' - 1, map2[i] = t[i] - 1, l2 = i + 1;
cin >> t;
for (int i = 0; i < strlen(t); i++)
t[i] -= '0' - 1, map3[i] = t[i] - 1, l3 = i + 1;
for (int i = 0; i < l2; i++)
{
for (int j = 0; j < l3; j++)
{
int x = map3[j];
for (int k = 0; k <= 2; k++)
{
if (map2[i] == 1)
map2[i] = 0;
else
map2[i] = 1;
map3[j] = k;
for (int l = 0; l < l2; l++)
ans2 += map2[l], ans2 *= 2;
ans2 /= 2;
for (int l = 0; l < l3; l++)
ans3 += map3[l], ans3 *= 3;
ans3 /= 3;
if (map2[i] == 1)
map2[i] = 0;
else
map2[i] = 1;
map3[j] = x;
if (ans2 == ans3) {
cout << ans2;
return 0;
}
ans2 = ans3 = 0;
}
}
}
}
3.小卡和质数
这道题完全就是逻辑题,我还被异或的概念困了很久。只有二进制下末位不同的数异或的结果才是一,既这两个质数必须一奇一偶,易得两个质数只能是二和三。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T,a,b;
cin >> T;
while(T--)
{
cin >> a >> b;
if((a==2&&b==1)||(a==1&&b==2)) puts("Yes");
else puts("No");
}
}