Hamon Odyssey
- Hamon Odyssey 题解
- 解题思路:
- 核心代码(套个main函数就完事了)
- Hamon Odyssey
Hamon Odyssey 题解
CF原题,洛谷原题
拓(一定要看呐!):
&
的详解
解题思路:
先将所有数&
,结果为正数时,只有一种情况,因为如果有多种情况结果不符合最小,大于等于正数。
当结果为0时,可有多种情况,这时就要保证能多分几组。我们从前往后遍历每次&a[i]
,当到j时结果为 0 0 0。就再新开一组ans++
,如果新的一组到结束后结果不为0
,那么就不计入答案(相当于合并到前一组 根据&
的性质得到前一组数&
这一组数结果 不变或变小( > 0 >0 >0))。
每次在统计新组的第一个数时,可用最大数每一位全 1 1 1的数来
&
新组第一个数,这样结果就是第一个数了
核心代码(套个main函数就完事了)
long long n, l;
long long a[N];
void solve(){// 竞赛程序cin >> n >> l;for (int i = 1; i <= n; i++) {cin >> a[i];}int num = 0;int ans1 = 0, ans2 = 0;for (int j = l - 1; j >= 0; j--) { //从前到后枚举每一位ans1 = 0, ans2 = 0;for (int i = 1; i <= n; i++) { int t = a[i] >> j & 1; // 取出他的第l-j位 if (t == 0) {ans1++;}else ans2++;}if (ans1 >= ans2) num = num * 2;else num = num * 2 + 1; //最终答案}cout << num << endl;
}