按元素的贡献值求最值的思想
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=24840
题解:
如果以每一个结点为基准计算总质量,并统计质量次数最多的那个,就是修改次数最少的,相当于每一个结点都贡献了以自己为基准的结果,因为总质量相同说明路径上又不需要更改的元素值。
思想:
例如:bfs求最短路,每一个结点提供的也是一种权值,也有贡献,最后通过计算贡献最少的即为最短路。
代码:
# 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\n",cnt-maxn);
}
return 0;
}
代码来源于网络