Codeforces#738(Div.2)-A

Mocha and Math


题目描述

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

比如取[l,r],之后 \(a_l\) 会变成 \(a_l\) & \(a_r\)
所以我们只需要确定 l = 1 不变, r 从 n 依次减小 \(a_1\)在最后一定会是\(a_1\) & \(a_2\) & \(a_3\) ... & \(a_n\) & ...,当然我们只需要\(a_1\) & \(a_2\) & \(a_3\) ... & \(a_n\)这一部分就行了,所以结果就出来了,就是 \(a_1\) & \(a_2\) & \(a_3\) ... & \(a_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;
}
posted @ 2021-08-17 11:36  伍六柒-  阅读(57)  评论(1)    收藏  举报