TC SRM551 DIV2 500 ColorfulChocolates 暴力

1 篇文章 0 订阅

题目大意:给一个由A-Z组成的字符串,最大转换maxSwaps次,问连续相同字符串最多多少。

代码:

#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <ctime>

using namespace std;

int num[60],path[60];

bool cmp(int a,int b)
{
    if(abs(a)<abs(b)) return true;
    else return false;
}

class ColorfulChocolates {
public:
	int maximumSpread(string chocolates, int maxSwaps)
	{
	    int ans=-1;
		for(int i=0;i<26;i++) //枚举每个字母
		{
		    int cnt=0;
		    for(int j=0;j<chocolates.length();j++) //寻找该字母所有出现的位置
		    {
		        if(chocolates[j]==('A'+i)) num[cnt++]=j;
		    }
		    for(int k=0;k<cnt;k++) //以某个字母为中心
		    {
		        int tempswaps=0,tempans=1;
		        memset(path,0,sizeof(path));
		        if(cnt==1) { if(ans<1) ans=1; break; }
		        if(cnt==2) {if(abs(num[1]-num[0]-1)<=maxSwaps) if(ans<2) ans=2; break; }
		        for(int p=0;p<cnt;p++)
		        {
		            if(p==k) continue;
		            path[p]=num[p]-num[k];
		        }
		        sort(path,path+cnt,cmp); //按距离绝对值排序
		        int l=1,r=1; //每靠过来一个下一个靠过来时需要转换的次数就小1(同方向的情况下)
		        for(int p=1;p<cnt;p++)
		        {
		            if(path[p]>0)
		            {
		                if((tempswaps+(path[p]-r))>maxSwaps) break;
		                tempswaps+=(path[p]-r); r++; tempans++;
		            }
		            else
		            {
		                if((tempswaps-path[p]-l)>maxSwaps) break;
		                tempswaps+=(-path[p]-l); l++; tempans++;
		            }
		        }
		        if(tempans>ans) ans=tempans;
		    }
		}
		return ans;
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值