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;
}

浙公网安备 33010602011771号