CF1654C Alice and Cakes 题解

大型鞭尸现场

Alice 有一块蛋糕,可以切 \(n-1\) 次,每次可以将大小为 \(w\) 的蛋糕切成大小为 \(\lfloor w/2 \rfloor\)\(\lceil w/2 \rceil\) 大小的两部分。
现在给出切了 \(n-1\) 次之后的 \(n\) 块蛋糕的大小 \(a_1,a_2,\dots,a_n\),判断是否可以做到把蛋糕切成最终这 \(n\) 块。多组数据,共 \(T\) 组。
\(t\le 10^4,1\le n,\sum n\le 10^5,1\le a_i\le 10^9\)

这题赛事我想了一个多小时才 A 掉,丢人现眼了。

首先考虑合并,发现搜索、贪心不可做,考虑 DP,然后没想出来怎么 DP。
然后发现这是 sb 题。

因为分割的结果是告诉我们的,所以可以直接分割,如果分割到刚好有需要这个大小的块,那么就不分了,否则继续分,如果分到 \(1\) 并且不需要 \(1\) 的大小,就证明不行。
复杂度分析:如果能分到,那么复杂度就是 \(O(n)\),如果不能就会分到 \(1\),不难发现需要分 \(\log a_i\) 次。
所以复杂度为 \(O(n+\log a_i)\)
代码:

int n; ll a[maxn],sum; map<long long,int> HASH,E;
int check(ll s){
	if(HASH[s]){ HASH[s]--; return 1; }
	if(s==1){ return 0; }
	return check(s/2)&&check(s-s/2);
}
void work(){
	n=read(); sum=0; HASH=E; int i; for(i=1;i<=n;i++) a[i]=read(),sum+=a[i],HASH[a[i]]++;
	if(check(sum)) puts("YES"); else puts("NO");
}
posted @ 2022-04-25 20:47  jiangtaizhe001  阅读(31)  评论(0编辑  收藏  举报