码迷,mamicode.com
首页 > 其他好文 > 详细

cf 551B 暴力枚举

时间:2015-07-16 22:24:21      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:暴力枚举

链接:

http://codeforces.com/contest/551/problem/B

交换a中字符的位置,求b,c字符串在a中出现的最多次数


枚举b出现的次数,然后求出c在a中还可以出现的最大次数,求得最多的次数

关键在于如何计算b出现的次数

代码如下:

for(int i = 0;i<26;i++)
if(s1[i])sum = min(sum,ans[i]/s1[i]);

知道了这个就不会超时了啦,我开始就没想到,多做题才是真的呢,每次都可以收获新的技能,加油!

每天进步一点点!

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define nmax 100005
char str[nmax],sub1[nmax],sub2[nmax];
int ans[27],s1[27],s2[28],cnt[27];
int main(void){
	scanf("%s%s%s",str,sub1,sub2);
	int len = strlen(str),len1 = strlen(sub1),len2= strlen(sub2);
	for(int i = 0;i<len;i++)cnt[str[i]-'a']++;
	for(int i=0;i<len1;i++)s1[sub1[i]-'a']++;
	for(int i=0;i<len2;i++)s2[sub2[i]-'a']++;
	int sum = 100000;
	int x = 0,y = 0;
	for(int i = 0;i<26;i++)if(s1[i])sum = min(sum,cnt[i]/s1[i]);
	for(int i = 0;i<=sum;i++){
		int t = 100000;
		for(int j = 0;j < 26;j++)if(s2[j])t = min(t,(cnt[j]-i*s1[j])/s2[j]);
		if(t+i>x+y)x = i, y = t;
	}
	for(int i = 0;i<x;i++)printf("%s",sub1);
	for(int j = 0;j<y;j++)printf("%s",sub2);
	for(int i = 0;i < 26;i++){
		cnt[i]-=(s1[i]*x+s2[i]*y);
		while(cnt[i])putchar('a'+i),cnt[i]--;
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

cf 551B 暴力枚举

标签:暴力枚举

原文地址:http://blog.csdn.net/meixiuxiudd/article/details/46916103

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!