题目类型:位运算

传送门:>Here<

题意:给出\(N\)个位运算操作,要求简化操作数量,使之结果不受影响(数据在1023之内)

解题思路

我们发现数字的每一位是独立的。也就是说,每一个操作可以看成是对数字的二进制的每一位进行操作。而二进制只有0或1,因此如果我们能够确定每一位有没有变,是怎么变的,就可以确定当前这一位发生了什么操作。因此,很显然我们可以把操作数量压缩成3步:&,|,^。

每一位的变化无非四种情况:对于初始状态和最终状态,不过时0->0,0->1,1->0,1->1。

因此如果我们知道每一位初始状态为0时的最终状态,初始状态为1的最终状态,就可以确定是怎么变的了

好了,那么我们设定两个数。一个是000000000(B),一个是111111111(B)。然后计算最终状态。然后将这两个数的同一位置的变化做一个比较

依然分类讨论。

如果0->0且1->0,那么等价于在这一位&0了。

如果0->0且1->1,等价于没有操作

如果0->1且1->0,等价于^1

如果0->1且1->1,等价于|1

注意&的那个数刚开始也是111111111(B)

反思

将一个数的每一位割裂开来看似乎很自然,却很难想。

对分类讨论思想依然不是很敏感。分类讨论思想在OI中是非常重要的,要多多去想分几类,如何分类。

Code

  1. /*By DennyQi 2018*/
  2. #include <cstdio>
  3. #include <queue>
  4. #include <cstring>
  5. #include <algorithm>
  6. using namespace std;
  7. typedef long long ll;
  8. const int MAXN = 10010;
  9. const int MAXM = 20010;
  10. const int INF = 1061109567;
  11. inline int Max(const int a, const int b){ return (a > b) ? a : b; }
  12. inline int Min(const int a, const int b){ return (a < b) ? a : b; }
  13. inline int read(){
  14. int x = 0; int w = 1; register char c = getchar();
  15. for(; c ^ '-' && (c < '0' || c > '9'); c = getchar());
  16. if(c == '-') w = -1, c = getchar();
  17. for(; c >= '0' && c <= '9'; c = getchar()) x = (x<<3) + (x<<1) + c - '0'; return x * w;
  18. }
  19. int N,x,y,a,b,c,t,b1,b2;
  20. char opt[5];
  21. int main(){
  22. scanf("%d", &N);
  23. x = 0, y = (1<<10)-1;
  24. a = y;
  25. for(int i = 1; i <= N; ++i){
  26. scanf("%s %d", opt, &t);
  27. if(opt[0] == '&'){
  28. x &= t, y &= t;
  29. }
  30. if(opt[0] == '|'){
  31. x |= t, y |= t;
  32. }
  33. if(opt[0] == '^'){
  34. x ^= t, y ^= t;
  35. }
  36. }
  37. for(int i = 0; i < 10; ++i){
  38. b1 = (1<<i) & y;
  39. b2 = (1<<i) & x;
  40. if(b1 && !b2) continue;
  41. if(!b1 && !b2){
  42. a -= (1<<i);
  43. }
  44. if(!b1 && b2){
  45. c += (1<<i);
  46. }
  47. if(b1 && b2){
  48. b += (1<<i);
  49. }
  50. }
  51. printf("3\n");
  52. printf("& %d\n| %d\n^ %d",a,b,c);
  53. return 0;
  54. }

Codeforces878 A. Short Program的更多相关文章

  1. Codeforces Round #443 (Div. 2) C. Short Program

    C. Short Program time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  2. Codeforces Round #443 (Div. 1) A. Short Program

    A. Short Program link http://codeforces.com/contest/878/problem/A describe Petya learned a new progr ...

  3. Codeforces Round #879 (Div. 2) C. Short Program

    题目链接:http://codeforces.com/contest/879/problem/C C. Short Program time limit per test2 seconds memor ...

  4. 443 C. Short Program

    http://codeforces.com/contest/879/problem/C Petya learned a new programming language CALPAS. A progr ...

  5. [Codeforces Round #443]Div2 C Short Program

    给你一串$n$个按顺序的位运算操作(&,|,^),形如"opt x",要求用不超过5行的位运算,按顺序操作出来和那个结果是一样的.$(n<=5e5,0<=x&l ...

  6. Codeforces 879C/878A - Short Program

    传送门:http://codeforces.com/contest/879/problem/C 本题是一个位运算问题——位运算的等价变换. 假设位运算符“&”“|”“^”是左结合的,且优先级相 ...

  7. 【Codeforces Round #443 (Div. 2) C】Short Program

    [链接] 我是链接,点我呀:) [题意] 给你一个n行的只和位运算有关的程序. 让你写一个不超过5行的等价程序. 使得对于每个输入,它们的输出都是一样的. [题解] 先假设x=1023,y=0; 即每 ...

  8. Codeforces Round #443 (Div. 2) C: Short Program - 位运算

    传送门 题目大意: 输入给出一串位运算,输出一个步数小于等于5的方案,正确即可,不唯一. 题目分析: 英文题的理解真的是各种误差,从头到尾都以为解是唯一的. 根据位运算的性质可以知道: 一连串的位运算 ...

  9. Codeforces 878A - Short Program(位运算)

    原题链接:http://codeforces.com/problemset/problem/878/A 题意:给出n个位运算操作, 化简这些操作, 使化简后的操作次数不多于5步. 思路:我们可以对二进 ...

随机推荐

  1. SAP MM MI01事务代码里的批次确定

    SAP MM MI01事务代码里的批次确定 1 – 批次管理启用之后果 一个物料如果启用了批次管理,那么库存管理以及盘点等诸多事务里都需要在批次的层次上进行. 货物移动的时候,需要在界面上指定相关货物 ...

  2. Xaramin IOS 开发常见问题

    调试时提示找不到obj某某文件,勾选后编译,再取消勾选后再次调试 APP不能上网(而且无法通过配置允许上网的APP,因为根本 找不到需要的APP),不要使用IOS11测试版本,自动禁网 截图路径 %U ...

  3. MySQL 使用Navicat连接MySQL8出现1251错误

    安装了MySQL8.x.x后使用Navicat连接总是出现1251错误,故在此记录一下解决方法. 错误提示 1251-Client does not support authentication pr ...

  4. 基于TCP 协议的RPC

    前言: 环境: windown 10 Eclipse JDK 1.8 RPC的概念: RPC 是远程过程调用,是分布式网站的基础. 实验 SayHelloService.java 接口类,用于规范 S ...

  5. C#比较两个由基本数据类型构成的object类型

    /// <summary> /// 比较查询条件 /// </summary> public class ModelExtensions { /// <summary&g ...

  6. 【转载】DSP基础--定点小数运算

    在FPGA实现算法过程中,大多数情况是用占用资源较少,延迟较低的定点数代替浮点数参与运算.那么浮点与定点数之间的区别以及转换方式是怎么的?下边这篇博文详细说明了这一问题.虽然是针对DSP芯片的,但思想 ...

  7. SpringMVC相关常用注解

    @Controller: @Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象 @RequestMapping: RequestMappin ...

  8. 自动化测试之路2---python安装

    借鉴这位老哥的文章http://www.cnblogs.com/shabbylee/p/6792555.html

  9. SQLServer之创建唯一非聚集索引

    创建唯一非聚集索引典型实现 唯一索引可通过以下方式实现: PRIMARY KEY 或 UNIQUE 约束 在创建 PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自 ...

  10. MPLAB X IDE调试仿真功能简单入门

    仿真分为硬件仿真和软件仿真,这里的硬件仿真和软件仿真的区别,就不多说了,相信大家都听说过这两个概念. 我这里想给大家介绍的是“Set PC at Cursor”--“设置PC到光标处”这个功能,这个功 ...