Alice and the Cake题解
AC记录:记录-洛谷
题面翻译(大概就是题目大意)
执行恰好 n − 1 n-1 n−1 次操作,每次操作可以选择当前所有蛋糕中满足其重量 w ⩾ 2 w\geqslant 2 w⩾2 的一块,然后将其分为质量分别为 ⌊ w 2 ⌋ \lfloor\dfrac w2\rfloor ⌊2w⌋ 和 ⌈ w 2 ⌉ \lceil\dfrac w2\rceil ⌈2w⌉ 的两块。
现在,给定执行完所有操作后
n
n
n 块蛋糕的重量是
a
1
,
a
2
⋯
,
a
n
a_1,a_2\cdots,a_n
a1,a2⋯,an,请判断是否存在一个初始蛋糕重量和操作序列使得最终能得到给定的
n
n
n 块蛋糕。如果能,输出 YES
,否则输出 NO
。
数据范围:
- t t t 组数据, 1 ⩽ t ⩽ 1 0 4 1\leqslant t\leqslant 10^4 1⩽t⩽104。
- 1 ⩽ n , ∑ n ⩽ 2 × 1 0 5 1\leqslant n,\sum n\leqslant 2\times 10^5 1⩽n,∑n⩽2×105。
- 1 ⩽ a i ⩽ 1 0 9 1\leqslant a_i\leqslant 10^9 1⩽ai⩽109。
Translated by Eason_AC
大致思路
分别递归+搜索 查看左半边蛋糕(左子树)和右半边蛋糕(右子树)是否符合规则。(二叉树+搜索+递归)
小小的代码
solve函数:
void solve() {
p.clear();
long long int n;
cin >> n;
long long int x;
long long int sum = 0;
for(int i = 1; i <= n; i++) {
cin >> x;
p[x]++;
sum += x;
}
if(dfs(sum))
cout << "YES" << endl;
else
cout << "NO" << endl;
}
递归
int dfs(long long int s) {
if(!s)
return 0;
if(mp[s]) {
mp[s]--;
return 1;
}
return dfs(s / 2) && dfs(s - (s >> 1));
}
寂寞的人唱伤心的歌~