HDU 3131 One…Two…Five! (暴力搜索)

题目链接:HDU 3131 One…Two…Five! (暴力搜索)

题意:给出一串数字,要求用加,减,乘,除(5/2=2)连接(计算无优先级:5+3*6=8*6=48),求全部结果中,含有‘3’且该数字出现频率最大。若频率相等,输出数字最大的。


暴力解决之


AC代码:



#include <stdio.h>
#include <map>
#include <string.h>
#include <algorithm>
#define LL __int64
using namespace std;
LL a[20],cnt,k;
map<LL,LL> ans;
map<LL,LL>::iterator it;
bool cmp(LL a,LL b)
{
	return a>b;
}

LL cal(LL sum,LL temp,LL op)
{
	if(op==0)
		return sum+temp;
	if(op==1)
		return sum-temp>0? sum-temp:temp-sum;
	if(op==2)
		return sum*temp;
	if(op==3)
		return sum/temp;
}

void dfs(LL x,LL sum)
{
	if(x==cnt)
	{
		LL tempsum=sum;
		while(tempsum)
		{
			if(tempsum%10==3)
			{
				ans[sum]++;
				k++;
				//printf("%I64d
",sum);
				break;
			}
			tempsum/=10;
		}
		return  ;
	}
	for(LL i=0;i<4;i++)
	{
		if(i==3 && a[x]==0)
			continue;
		LL temp=cal(sum,a[x],i);
		dfs(x+1,temp);
	}
}

int main()
{
	char s[100];
	LL len,i;
	while(gets(s))
	{
		if(s[0]=='#')
			break;
		ans.clear();
		len=strlen(s);
		LL temp;
		cnt=temp=0;
		for(i=0;i<len;i++)
		{
			if(s[i]==' ')
			{
				a[cnt++]=temp;
				temp=0;
				continue;
			}
			temp=temp*10+s[i]-'0';
		}
		a[cnt++]=temp;
		k=0;
		dfs(1,a[0]);
		if(k)
		{
			LL maxt=-1,maxans;
			for(it=ans.begin();it!=ans.end();it++)
			{
				if(maxt<=(it->second))
				{
					maxt=it->second;
					maxans=it->first;
					if((it->first)>maxans)
						maxans=it->first;
				}
			}
			printf("%I64d
",maxans);
		}
		else
			printf("No result
");
	}
	return 0;
}


原文地址:https://www.cnblogs.com/llguanli/p/7105734.html