B. ZgukistringZ(枚举)

https://codeforces.com/problemset/problem/551/B


题意:给定a,b,c串。问能在a中选出多少总个数最多的b,c串。

思路:开始想着贪心,发现没法贪心(wa12)。考虑枚举。由于b,c串是定的,所以最开始可以得出主串a给b的最多次数ans,那么然后考虑主串a给c的次数。枚举i:0~ans,然后考虑次数剩余的a串中的数目能最多给c串多少,在过程中更新最值。最后输出。

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=1e5+100;
typedef long long LL;
map<char,LL>map1,map2,map3;
map<char,LL>:: iterator it;
int main(void)
{
  string a,b,c;cin>>a>>b>>c;
  for(LL i=0;i<a.size();i++){
  	map1[a[i]]++;
  }
  for(LL i=0;i<b.size();i++){
  	map2[b[i]]++;
  }
  for(LL i=0;i<c.size();i++){
  	map3[c[i]]++;
  }
  LL ans=0x3f3f3f3f;//主串能给b串的最多的次数 
  for(it=map2.begin();it!=map2.end();it++)
  {
  	ans=min(ans,map1[it->first]/(it->second));
  }
  LL sum1=0;LL sum2=0;LL tot=0;
  for(LL i=0;i<=ans;i++)//枚举主串给b串几个
  {
  	map<char,LL>mapnow;
  	LL res=0x3f3f3f3f;
	for(it=map1.begin();it!=map1.end();it++)
	{
		mapnow[it->first]=(it->second);	
	}	
	for(it=map2.begin();it!=map2.end();it++)
	{
		mapnow[it->first]-=i*(it->second);
	}
	for(it=map3.begin();it!=map3.end();it++)
	{
		res=min(res,mapnow[it->first]/(it->second));
	}
	if(res+i>tot)
	{
		sum1=i;
		sum2=res;
		tot=res+i;
	}
  } 
  for(LL i=1;i<=sum1;i++){
  	cout<<b;
  }
  for(LL i=1;i<=sum2;i++){
  	cout<<c;
  }
  for(it=map2.begin();it!=map2.end();it++){
  	map1[it->first]-=sum1*(it->second);
  }
  for(it=map3.begin();it!=map3.end();it++){
  	map1[it->first]-=sum2*(it->second);
  }
  for(it=map1.begin();it!=map1.end();it++){
  	for(LL i=1;i<=it->second;i++){
  		cout<<it->first; 
	}
  }
  cout<<endl;
return 0;
}

猜你喜欢

转载自blog.csdn.net/zstuyyyyccccbbbb/article/details/108625426