题目大意:改变二叉树上的权值,使树平衡,问最少该几个值。
题目分析:不会做,查的题解。有条奇妙的性质:如果将第d层权值为w的节点为基准做改动,则整棵树的总重量为w<<d,即w*2^d。仔细一想,确实是这样的。
代码如下:
# include<iostream> # include<cstdio> # include<map> # include<cstring> # include<algorithm> using namespace std; int cnt; string str; map<long long,int>mp; void solve(int l,int r,int d) { if(str[l]=='['){ int flag=0; for(int i=l+1;i<r;++i){ if(str[i]=='[') ++flag; if(str[i]==']') --flag; if(!flag&&str[i]==','){ solve(l+1,i-1,d+1); solve(i+1,r-1,d+1); } } }else{ long long w=0; for(int i=l;i<=r;++i) w=w*10+str[i]-'0'; ++cnt; ++mp[w<<d]; } } int main() { int T; scanf("%d",&T); while(T--) { mp.clear(); cnt=0; cin>>str; solve(0,str.size()-1,0); int maxn=0; for(map<long long,int>::iterator it=mp.begin();it!=mp.end();++it) maxn=max(maxn,it->second); printf("%d ",cnt-maxn); } return 0; }