AcWing 1875.贝茜的报复
目录
- 题目
- 解题思路
- C++代码
- Java代码(带注释)
题目
农夫约翰和奶牛贝茜喜欢在业余时间互相出数学题。
约翰给贝茜出了一道相当难的问题,导致她没能解决。
现在,她希望通过给约翰出一道有挑战性的难题来报复他。
贝茜给了约翰一个表达式 (B+E+S+S+I+E)(G+O+E+S)(M+O+O),其中包含七个变量 B,E,S,I,G,O,M(O 是变量,不是零)。
对于每个变量,她给约翰一个列表,表中包含该变量可采用的最多 20 个整数值。
她要求约翰计算,共有多少种给变量赋值的方法可以使得表达式的计算结果偶数。
输入格式
第一行包含一个整数 N。
接下来 N 行,每行包含一个变量和该变量的一个可能值。
每个变量至少出现 1 次,最多出现 20 次。
同一变量不会重复列出同一可能值。
输出格式
输出可以使得表达式的计算结果是偶数的给变量赋值的方法总数。
数据范围
7≤N≤140,
所有变量的可能取值范围 [−300,300]
输入样例:
10
B 2
E 5
S 7
I 10
O 16
M 19
B 3
G 1
I 9
M 2
输出样例:
6
样例解释
共有 6 种可能的赋值方式:
(B,E,S,I,G,O,M) = (2, 5, 7, 10, 1, 16, 19) -> 53,244= (2, 5, 7, 10, 1, 16, 2 ) -> 35,496= (2, 5, 7, 9, 1, 16, 2 ) -> 34,510= (3, 5, 7, 10, 1, 16, 2 ) -> 36,482= (3, 5, 7, 9, 1, 16, 19) -> 53,244= (3, 5, 7, 9, 1, 16, 2 ) -> 35,496
注意,(2, 5, 7, 10, 1, 16, 19) 和 (3, 5, 7, 9, 1, 16, 19),虽然计算结果相同,但是赋值方式不同,所以要分别计数。
解题思路
首先,题目中的式子为
(B+E+S+S+I+E)(G+O+E+S)(M+O+O)(B+E+S+S+I+E)(G+O+E+S)(M+O+O) (B+E+S+S+I+E)(G+O+E+S)(M+O+O)
可以化简为
(B+I+2E+2S)(E+G+O+S)(M+2O)(B+I+2E+2S)(E+G+O+S)(M+2O) (B+I+2E+2S)(E+G+O+S)(M+2O)
因为题目中要求结果为偶数即可
而偶数+偶数 = 偶数
奇数+偶数 = 奇数
所以每一项里的偶数对每一项的奇偶没有影响,即2E,2S,2O并不会影响最终结果所以式子可以化简为
M(B+I)(E+G+O+S)M(B+I)(E+G+O+S) M(B+I)(E+G+O+S)
且式子中 7 个变量均出现了,所以去掉其中的偶数项不会影响方案数
又因为偶数*偶数 = 偶数
奇数*偶数 = 偶数
所以只要这三项中有一项为偶数即可,其他两项中的数可以随意组合
设某变量为 0 时代表该变量为偶数,为 1 时代表该变量为奇数
那么当 M 为偶数时,即 M 的状态为 0 时,最后结果必为偶数,其他数的所有组合均为可行解
当 B 和 I 都为偶数或者都为奇数时,即两者状态相同,均为 0 或者均为 1 时,即两者异或等于 0 时,最后结果必为偶数,其他数的所有组合均为可行解
当 E,G,O,S 都为偶数,或者都为奇数,或者两奇两偶时,即奇数的个数为偶数个时,即四者状态异或为 0 时,最后结果必为偶数,其他数的所有组合均为可行解
每一个可行解的方案数=∏j=06第j个变量当前状态(偶数/奇数)的个数每一个可行解的方案数=\prod\limits_{j = 0}^6 第 j 个变量当前状态(偶数/奇数)的个数 每一个可行解的方案数=j=0∏6第j个变量当前状态(偶数/奇数)的个数
总方案数就是将每一个方案数相加
C++代码
#include<iostream>
#include<map>using namespace std;int n;
int res = 0;
int count[7][2];
std::map<char,int> key;int main()
{std::ios::sync_with_stdio(false);key['M'] = 6;key['B'] = 5;key['I'] = 4;key['E'] = 3;key['G'] = 2;key['O'] = 1;key['S'] = 0;cin >> n;for(int i = 0; i < n; i++){char ch;int x;cin >> ch >> x;if(x % 2 == 0) count[key[ch]][0]++;else count[key[ch]][1]++;}for(int i = 0; i < 1 << 7; i++){bool m = (i >> 6) & 1;bool b_i = ((i >> 5) & 1) ^ ((i >> 4) & 1);bool e_g_o_s = ((i >> 3) & 1) ^ ((i >> 2) & 1) ^ ((i >> 1) & 1) ^ (i & 1);if(!m || !b_i || !e_g_o_s){int temp = 1;for(int j = 0; j < 7; j++) temp *= count[j][(i >> j) & 1];res += temp;}}cout << res << endl;
}
Java代码(带注释)
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int sum = 0;Map<Character, Integer> map = new LinkedHashMap<Character, Integer>();map.put('M', 6);map.put('B', 5);map.put('I', 4);map.put('E', 3);map.put('G', 2);map.put('O', 1);map.put('S', 0);int[][] count = new int[7][2]; // 存储每个变量偶数和奇数的个数,分别对应下标 0 和 1for(int i = 0; i < n; i++) {char ch = sc.next().toCharArray()[0];int x = sc.nextInt();if(x % 2 == 0) count[map.get(ch)][0]++; // 记录该变量偶数的个数else count[map.get(ch)][1]++; // 记录该变量奇数的个数}/** M * (B + I) * (E + G + O +S)* 设选偶数为 0,选奇数为 1* 总共有 2^7 种排列方式,即[00000000-10000000)*/for(int i = 0; i < 1 << 7; i++) {boolean m = (i >> 6 & 1) == 0; // 若最高位为 0,则说明该位为偶数,即结果必为偶数,否则该位为奇数,结果未知// 若第 5位和第 4位异或为 0,则说明两个全 0或者全 1,即全奇或者全偶,即结果必为偶数,若异或为1,则一奇一偶,结果未知boolean b_i = ((i >> 5 & 1) ^ (i >> 4 & 1)) == 0; // 若第 3、2、1、0位异或为 0,则说明 0和 1的个数均为偶数,即奇数和偶数的个数均为偶数个,即结果必为偶数,若异或结果为 1,说明有奇数个奇数,结果未知boolean e_g_o_s = ((i >> 3 & 1) ^ (i >> 2 & 1) ^ (i >> 1 & 1) ^ (i & 1)) == 0;int temp = 1;// 若三项中有任意一项为偶数,则乘积必为偶数if(m || b_i || e_g_o_s) { for(int j = 0; j < 7; j++) {temp *= count[j][(i >> j) & 1]; // 若该变量选择了偶数/奇数(0/1),则乘上该变量偶数/奇数的个数(count[j][0/1])}sum += temp; // 加入总方案数种}}System.out.println(sum);sc.close();}}
AcWing 1875.贝茜的报复相关推荐
- 1875.贝茜的报复
Powered by:NEFU AB-IN Link 文章目录 1875.贝茜的报复 题意 思路 代码 1875.贝茜的报复 题意 农夫约翰和奶牛贝茜喜欢在业余时间互相出数学题. 约翰给贝茜出了一道相 ...
- 1875 贝茜的报复(dfs、二进制)
1. 问题描述: 农夫约翰和奶牛贝茜喜欢在业余时间互相出数学题.约翰给贝茜出了一道相当难的问题,导致她没能解决.现在,她希望通过给约翰出一道有挑战性的难题来报复他.贝茜给了约翰一个表达式 (B+E+S ...
- 1875. 贝茜的报复
题目描述 农夫约翰和奶牛贝茜喜欢在业余时间互相出数学题. 约翰给贝茜出了一道相当难的问题,导致她没能解决. 现在,她希望通过给约翰出一道有挑战性的难题来报复他. 贝茜给了约翰一个表达式 (B+E+S+ ...
- 寒假每日一题——贝茜的报复
贝茜的报复 问题描述 农夫约翰和奶牛贝茜喜欢在业余时间互相出数学题. 约翰给贝茜出了一道相当难的问题,导致她没能解决. 现在,她希望通过给约翰出一道有挑战性的难题来报复他. 贝茜给了约翰一个表达式 ( ...
- AcWing 1934. 贝茜放慢脚步(二路归并)
题目链接 https://www.acwing.com/problem/content/description/1936/ 思路 题目的标签是二路归并,其实就是贪心,可以对比我们之前学习归并算法那里, ...
- 贝茜的报复(dfs + 位运算)
原题链接 本题关键在于二进制的转化,如果直接枚举每个字母(共7个字母)的20种可能就会TLE 另外需要了解以下公式: #include <iostream> #include <cs ...
- [BZOJ1643][Usaco2007 Oct]Bessie's Secret Pasture 贝茜的秘密草坪
1643: [Usaco2007 Oct]Bessie's Secret Pasture 贝茜的秘密草坪 Time Limit: 5 Sec Memory Limit: 64 MB Submit: ...
- BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划
题目 1613: [Usaco2007 Jan]Running贝茜的晨练计划 Time Limit: 5 Sec Memory Limit: 64 MB Description 奶牛们打算通过锻炼来 ...
- bzoj 3407: [Usaco2009 Oct]Bessie's Weight Problem 贝茜的体重问题(DP)
3407: [Usaco2009 Oct]Bessie's Weight Problem 贝茜的体重问题 Time Limit: 3 Sec Memory Limit: 128 MB Submit: ...
最新文章
- Oracle Exadata 简介
- ConcurrentHashMap源码解析(2)
- php 获取文件后缀_php获取文件后缀的9种方法
- HDU - 5316 Magician(线段树区间合并)
- 代码与html混合,自定义的标签与html的标签混合应用_css
- 分享25个高质量的移动设备wordpress主题(Mobile theme)
- 快速打开 Mac OS X 隐藏的用户资源库文件夹
- Animate:基础学习
- SVN 安装与使用教程 2020年9月更新最新教程
- C语言在数组中查找特定整数,c语言在数组中查找某个元素
- 东原服务器开机显示bb,启用tls后,服务器出现remote error: tls: bad certificate
- Google Earth Engine APP(GEE)——用一个选择器选择不同城市的应用
- android群聊红包原理,Android之微信抢红包实现原理分析
- 音质媲美入耳式耳机,设计时尚续航出色,南卡Runner Pro 4体验
- 使用 ifconfig 查看本机 ip
- Html和css 两张图片叠加一起
- 【案例】中国银联、光大银行基于区块链的可信电子凭证系统
- MetaQ中间件原理浅析
- 允许 流程 强制收回
- 《 敏捷软件开发》已开始连载
热门文章
- 罗克韦尔自动化通过收购ASEM加强控制和可视化产品组合
- DXP_protel2004_原理图设计基础_新建和添加原理图库文件
- 前端知识零零散散,如何高效学习?
- 国际计算机网络与信息安全博览会,2018中国(成都)国际计算机网络及信息安全展览会暨论坛...
- web前端期末大作业 html+css+javascript网页设计实例 企业网站制作内容
- 让你的APP实现即时聊天功能
- 扩展欧几里得算法及贝祖定理的证明
- 2022年广东省安全员A证第三批(主要负责人)考试练习题及在线模拟考试
- python多进程和进程池
- java图形界面计算器_java图形界面 计算器实现