HDU 3131 One…Two…Five! (暴力搜索)
阿新 • • 發佈:2017-07-02
data- pre ack cal amp names php result one
題目鏈接: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! (暴力搜索)