首页 > 代码库 > CodeForces 778B - Bitwise Formula
CodeForces 778B - Bitwise Formula
题意:
选择一个 m 位的二进制数字,总分为 n 个算式的答案之和。问得到最低分和最高分分别应该取哪个二进制数字
分析:
因为所有数字都是m位的,因为高位的权重大于地位 ,我们就从高到低考虑 ans 的每一位是取 0 还是取 1,统计该位的权重(即n个式子该位结果之和)即可。
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n, m; 4 map<string, int> mp; 5 struct query{ 6 string f; 7 int num; 8 int a, op, b; 9 }q[5005];10 void init()11 {12 cin >> n >> m;13 string s;14 mp["?"] = 0;15 for (int i = 1; i <= n; i++)16 {17 cin >> s;18 mp[s] = i;19 cin >> s; 20 cin >> s;21 if (s[0] >= ‘0‘ && s[0] <= ‘9‘)22 {23 q[i].op = 0;24 q[i].f = s;25 } 26 else27 {28 q[i].a = mp[s];29 cin >> s;30 if (s[0] == ‘A‘) q[i].op = 1;31 if (s[0] == ‘O‘) q[i].op = 2;32 if (s[0] == ‘X‘) q[i].op = 3;33 cin >> s;34 q[i].b = mp[s];35 }36 }37 }38 int find(int x, int p)39 {40 int ret = 0;41 q[0].num = p;42 for (int i = 1; i <= n; i++)43 {44 if (q[i].op == 0) q[i].num = q[i].f[x]-‘0‘;45 else46 {47 int a = q[q[i].a].num;48 int b = q[q[i].b].num;49 if (q[i].op == 1) q[i].num = a&b;50 if (q[i].op == 2) q[i].num = a|b;51 if (q[i].op == 3) q[i].num = a^b;52 }53 ret += q[i].num;54 }55 return ret;56 }57 void solve()58 {59 string ans1, ans2;60 for (int i = 0; i < m; i++)61 {62 int x0 = find(i, 0);63 int x1 = find(i, 1);64 x0 <= x1 ? ans1 += ‘0‘ : ans1 += ‘1‘;65 x0 >= x1 ? ans2 += ‘0‘ : ans2 += ‘1‘;66 }67 cout << ans1 << endl << ans2 << endl;68 }69 int main()70 {71 init();72 solve();73 }
CodeForces 778B - Bitwise Formula
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。