1 条题解
-
0
自动搬运
来自洛谷,原作者为

Light_Star_RPmax_AFO
踏破千山去,直上九重天搬运于
2025-08-24 21:15:22,当前版本为作者最后更新于2023-08-22 13:55:15,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
[NICA #2] 爱与不爱
简化一下思路。
前言
本题第一篇题解。
题目描述
给出一个 和一个序列 ,你可以让 变成 $\lfloor \frac{a_i}{2} \rfloor (\lfloor \frac{a_i}{2} \rfloor \ne 0)$ 并且将 变成 ,求序列和的最小值。
注: 代表 。
简化思路
考虑将所有数优化到最小值:
随便选取两个数 ,则可以先将其中一个数的权值赋给另一个数,最终会得到 同理,我们最后可以化为 $2^{\lfloor\log_2 n\rfloor}, 2^{\lfloor\log_2 m\rfloor}$,当我们有 时,易得有贪心思路。
让他们差尽可能最小化。
抽屉原理,当数列为 时,我们总共会有 $\lfloor\log_2 x\rfloor+\lfloor\log_2 y\rfloor + \lfloor\log_2 y\rfloor$ 个 可以分配,差最小,合理分配即可。
思路
我们可以思考若 ,那么 变成后最小的 $a_i = 2 ^ {(\lfloor\log_2 2\rfloor + \lfloor \log_2 5\rfloor + \lfloor\log_2 9\rfloor)}$,也就是 。
那么我们就可以得到最小的 ,也就是原序列中的 。
积不变,差小和小。
我们考虑分配这些 ,最后得到的就是平分后的数 和剩余的 的个数 $cnt = {\lfloor\log_2 {(\prod_{i = 1}^n a_i)}\rfloor} - sum \times n$,再将 个 分到每个值中,所组成的式子 。
警钟敲烂
不开
long long见祖宗。AC Code
#include<bits/stdc++.h> #define int long long using namespace std; inline int read(){ int x = 0,f = 1;char ch = getchar(); while (ch < '0' || ch > '9'){if(ch == '-') f = -1;ch = getchar();} while (ch >= '0' && ch <= '9'){x = x * 10 + ch - 48;ch = getchar();} return x * f; } inline int _2(int x){ int ans = 0; while(x != 1){ x >>= 1; ans++; } return ans; } int n, ans, a; signed main(){ n = read(); for(int i = 1;i <= n;i++) a = read(),ans += _2(a); int sum = ans / n, cnt = ans - (sum * n); cout << (1 << sum) * (n - cnt) + (1 << sum + 1) * cnt; return 0; }
- 1
信息
- ID
- 8841
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者