Equilibrium Mobile UVA - 12166

这个题目思路如下:对于不同层的节点,赋予不同的权值,权值是以2为基的,也就是对于第一层权值为1,第二层为2,第三层为4,依此类推,然后在分析字符串的时候我们记录相应的层数,如果分析到数字,就计算出该数字并且乘上相应的权值,存入vector中,之后对vector排序,分析vector中连续相同的数字的最大个数,那么用vector的长度减去个数就可以得到最终的结果,注意:由于在计算过程中可能会产生非常大的数值,所以我们需要使用long long int类型来避免溢出,这是个小坑,其他的具体实现见如下代码:

#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<sstream>
#include<cstdio>
using namespace std;

int Case;
typedef long long int LL;

int main(){
	cin >> Case;
	LL weight[20];
	weight[0] = 1;
	LL i = 1;
	while (i < 20){
		weight[i] = weight[i - 1] << 1;
		i++;
	}
	while (Case--){
		string s;
		cin >> s;
		if (s[0] >= '0'&&s[0] <= '9'){
			cout << "0" << endl; 
			continue;
		}
		vector<LL> data;
		LL level = 0;
		for (int i = 0; i < s.size(); i++){
			if (s[i] == '[') level++;
			else if (s[i] == ']') level--;
			else if (s[i] == ',') continue;
			else{
				LL num = 0,j;
				for (j = i; j < s.size(); j++){
					if (s[j] >= '0'&&s[j] <= '9'){
						num = num * 10 + (s[j] - '0');
					}
					else break;
				}
				num = num*weight[level];
				data.push_back(num);
				if (j > s.size()-1) i = j;
				else i = j - 1;
			}
		}
		sort(data.begin(),data.end());
		LL t_ans = 1;
		LL ans = -1;
		for (int i = 1; i < data.size(); i++){
			if (data[i] == data[i - 1]) t_ans++;
			else{
				ans = max(ans,t_ans);
				t_ans = 1;
			}
		}
		ans = max(ans,t_ans);
		cout << data.size() - ans << endl;
	}
	//system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值