题目链接
题目大意:
给出天平,至少修改多少个秤砣可以使天平平衡。
分析:
如果一个天平平衡,上一层一侧的重量一定为下一层其中一个的二倍。
所以用该秤砣的重量*pow(2,层数)代表其权值。当一个天平平衡时,所有秤砣的权值应该相同的。所以我们用总叶子结点数目减去权值数目最多的数目即为最少的修改数量。
第一次没用递归,udebug全过了,但光荣超时了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Node
{
ll num,weight;
int floor;
Node(ll _num, ll _weight, int _floor):
num(_num), weight(_weight), floor(_floor){}
};
const int maxn = 1<<16;
vector<Node> vec;
multimap<ll,int> mnum;
int main() {
int n;
cin >> n;
string str;
while(n--) {
cin >> str;
vec.clear();
mnum.clear();
int cnt = 0,num = 0,mm = 0;
for(int i = 0; i < (int)str.length(); i++) {
ll sum = 0; bool flag = false;
while(isdigit(str[i]) && i < (int)str.length()) {
flag = true;
sum = sum*10 + (str[i]-'0');
i++;
}
if(flag) {
vec.push_back(Node(sum,0,num));
cnt++;
}
if(str[i]=='[') num++;
else if(str[i]==']') num--;
}
for(int i = 0; i < (int)vec.size(); i++) {
vec[i].weight = vec[i].num<<vec[i].floor;
mnum.insert({vec[i].weight,0});
}
for(int i = 0; i < (int)vec.size(); i++) {
if((int)mnum.count(vec[i].weight)>mm)
mm = mnum.count(vec[i].weight);
}
cout << cnt-mm << endl;
}
}
用递归的方法是看别人的题解,才写出来的,要多加强递归题目的练习!!
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
string str;
int cnt, ans;
map<ll,int> map1;
void dfs(int floor, int beg, int ed) {
if(str[beg]=='[') {//到下一层
int flag = 0;
for(int i = beg+1; i < ed; i++) {
if(str[i]=='[') flag++;
if(str[i]==']') flag--;
if(!flag && str[i]==',') {
dfs(floor+1, beg+1, i-1);//左子树
dfs(floor+1, i+1, ed-1);//右子树
}
}
}
else {
ll num = 0;
for(int i = beg; i <= ed; i++)
num = num*10 + str[i]-'0';
cnt++;
map1[num<<floor]++;
if(map1[num<<floor]>ans) ans = map1[num<<floor];
}
}
int main() {
freopen("i.txt","r",stdin);
freopen("o.txt","w",stdout);
int n;
cin >> n;
while(n--) {
map1.clear();
cnt = 0, ans = 0;
cin >> str;
dfs(0,0,str.length()-1);
cout << cnt-ans << endl;
}
}