Uva-12166 Equilibrium Mobile

来源:互联网 发布:js怎么让按钮不可点击 编辑:程序博客网 时间:2024/05/16 06:05

题目链接:Equilibrium Mobile

题目大意:给一个树形结构的天平,求能使整个天平平衡的最少的对砝码的更换次数。

解题思路:要使天平平衡最后情况一定是以某个砝码作为基准。枚举砝码,并记录不改变该砝码使天平平衡的情况下,天平的总权值。最后将所有砝码的数量减去最大次数的最终状态的值,即为最小的修改数。

代码如下:

#include <map>#include <set>#include <stack>#include <queue>#include <cstdio>#include <vector>#include <cstdlib>#include <cstring>#include <iomanip>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;typedef pair<int, int> P;const int inf = 0x3f3f3f3f;const int maxn = 2e4 + 15;map<ll, int> mp;int sum, t;string s;void DFS(int l, int r, int dep){    if(s[l] == '['){        int cnt = 0;        for(int i = l + 1; i < r; i++){            if(s[i] == '[') cnt++;            if(s[i] == ']') cnt--;            if(s[i] == ',' && !cnt){                DFS(l + 1, i - 1, dep + 1);                DFS(i + 1, r - 1, dep + 1);            }        }    }       else{        ll w = 0;           for(int i = l; i <= r; i++) w = w * 10 + s[i] - '0';        sum++; mp[w << dep]++;    }    return;}int main(){#ifdef LOCAL    freopen("in.txt", "r", stdin);#endif    ios::sync_with_stdio(false);    cin >> t;    while(t--){        cin >> s;        mp.clear();        sum = 0;        DFS(0, s.size() - 1, 0);        int ma = -1;        for(auto e : mp) ma = max(ma, e.second);        int ans = sum - ma;        cout << ans << endl;    }     return 0;}
0 0
原创粉丝点击