Codeforces#738(Div.2)-A
Mocha and Math
题目描述
一天,Mocha得到了一个长度为n的数组。每一次操作,她可以选择一个任意的区间[l,r]和所有的 i (0<= i <= r-l),用 & 代替 ( &是指‘与’位运算),这个操作可以进行任意次。
例如 n = 5,arr = [,,,,],Mocha选择了[2,5],经过这次操作后获得了新的数组arr = [, &, &, &, &],现在Mocha想经过一系列操作后,得到最小化的最大值,请你计算并输出最大值。
- 第一行输入测试样例个数 T (0 < T <= 100)
- 接下来每行输入一个 n 表示数组元素个数 (0 < n <= 100)
- 最后输入 n 个整数 ai ( 0 <= ai <= 1e9 )
想提看原题提交代码 点击这里
Input
4 2 1 2 3 1 1 3 4 3 11 3 7 5 11 7 15 3 7
Output
0 1 3 3
解题思路
与运算的规则:
怎么联系到这个题上呢?
当给定一个系列数之后,如果把这些数全部都转换为32位二进制数,如果挨个进行与运算,最后得到的结果是不是最小的呢?一定是的,为什么呢?每次与运算只有两个数在某一位同时为1时这一位的结果才为1,所有两个数进行与运算,结果只会更小或者不变。
但是按照这个题的要求怎么取才能得到 & & ... & 呢?其实,你可以发现一个规律:
比如取[l,r],之后 会变成 &
所以我们只需要确定 l = 1 不变, r 从 n 依次减小 在最后一定会是 & & ... & & ...,当然我们只需要 & & ... & 这一部分就行了,所以结果就出来了,就是 & & ... &
AC-代码
#include <iostream> #include <cstdio> using namespace std; int t,n,a,b; int main(){ scanf("%d",&t); while(t--){ scanf("%d",&n); scanf("%d ",&a); // 读入 a1 n -= 1; while(n--){ scanf("%d",&b); a = a & b; //把结果记录到a1头上 } printf("%d\n",a); } return 0; }
本文作者:伍六柒-
本文链接:https://www.cnblogs.com/paper-plane/p/15151607.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步