首页 > 代码库 > HDU 3131 One…Two…Five! (暴力搜索)
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\n",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\n",maxans); } else printf("No result\n"); } return 0; }
HDU 3131 One…Two…Five! (暴力搜索)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。