Codeforces#738(Div.2)-A

Mocha and Math


题目描述

一天,Mocha得到了一个长度为n的数组。每一次操作,她可以选择一个任意的区间[l,r]和所有的 i (0<= i <= r-l),用 al+i & ari 代替 al+i ( &是指‘与’位运算),这个操作可以进行任意次。
例如 n = 5,arr = [a1,a2,a3,a4,a5],Mocha选择了[2,5],经过这次操作后获得了新的数组arr = [a1, a2&a5, a3&a4, a4&a3, a5&a2],现在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,所有两个数进行与运算,结果只会更小或者不变。
但是按照这个题的要求怎么取才能得到a1 & a2 & a3 ... & an呢?其实,你可以发现一个规律:

比如取[l,r],之后 al 会变成 al & ar
所以我们只需要确定 l = 1 不变, r 从 n 依次减小 a1在最后一定会是a1 & a2 & a3 ... & an & ...,当然我们只需要a1 & a2 & a3 ... & an这一部分就行了,所以结果就出来了,就是 a1 & a2 & a3 ... & an


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 中国大陆许可协议进行许可。

posted @   伍六柒-  阅读(48)  评论(1编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开