博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
暴力题,速算24点
阅读量:5057 次
发布时间:2019-06-12

本文共 2691 字,大约阅读时间需要 8 分钟。

题目总结:

1.绝对暴力题。复杂度4*4*4*4*3*2*1*5远远达不到1000ms

2.涉及到next_permutation(p,p+n)全排列方法

解题过程的问题:

1.一直超时,最后改了很多局部变量成全局变量,906ms水过,很险。

2.之前wa了不下10次,思路有问题:排列数字和符号,按照符号的优先级进行计算,wa了,应该有括号

3.要学会证明为什么上面的想法不对。例如,(a+b)*(c+d)=24是唯一解,若只按照优先级,永远只能计算a+(b*c)+d,那永远达不到终点。

4.括号匹配情况有5中,列举一下就知道(a#b)#(c#d),((a#b)#c)#d,a#((b#c)#d),(a#(b#c))#d,a#((b#c)#d)

用了半天时间来做了,水题。

#include 
#include
#include
using namespace std;#define inf -10000int n[10];int get(char *a){ if(a[0]=='1'&&a[1]=='0') return 10; if(a[0]=='A') return 1; if(a[0]=='J') return 11; if(a[0]=='Q') return 12; if(a[0]=='K') return 13; return a[0]-'0';}int note(int a,int b,int k){ if(k==0) return a+b; if(k==1) return a-b; if(k==2) return a*b; if(k==3 && b!=0) { if(a%b==0) return a/b; else return inf; } if(k==3 && b==0) return inf;}int a,b,c,d;int i,j,k;int cal1(){ int res = a; int t1=note(a,b,i); if(t1 == inf) return -1; int t2=note(t1,c,j); if(t2==inf) return -1; int t3=note(t2,d,k); if(t3==inf) return -1; return t3;}int cal2(){ int t1=note(a,b,i),t2=note(c,d,k); if(t1==inf || t2==inf) return -1; int t3 = note(t1,t2,j); return t3==inf ? -1 : t3;}int cal3(){ int t1=note(b,c,j); if(t1==inf) return -1; int t2=note(a,t1,i); if(t2==inf) return -1; int t3=note(t2,d,k); return t3==inf ? -1 : t3;}int cal4(){ int t1=note(b,c,j); if(t1==inf) return -1; int t2=note(t1,d,k); if(t2==inf) return -1; int t3=note(a,t2,i); return t3==inf ? -1 : t3;}int cal5(){ int t1=note(c,d,k); if(t1==inf) return -1; int t2=note(b,t1,j); if(t2==inf) return -1; int t3=note(a,t2,i); return t3==inf?-1:t3;}int t1,t2,t3,t4,t5;bool deal(){ for(i=0;i<4;i++) { for(j=0;j<4;j++) { for(k=0;k<4;k++) { t1=cal1(); t2=cal2(); t3=cal3(); t4=cal4(); t5=cal5(); if(t1==24||t1==-24) return 1; if(t2==24||t2==-24) return 1; if(t3==24||t3==-24) return 1; if(t4==24||t4==-24) return 1; if(t5==24||t5==-24) return 1; } } } return 0;}bool cal(){ sort(n+1,n+5); do { a=n[1],b=n[2],c=n[3],d=n[4]; if(deal()) return true; } while(next_permutation(n+1,n+5)); return false;}int main(){ char c1[3],c2[3],c3[3],c4[3]; while(scanf("%s %s %s %s",c1,c2,c3,c4)!= EOF) { n[1]=get(c1);n[2]=get(c2);n[3]=get(c3);n[4]=get(c4); if(cal()) puts("Yes"); else puts("No"); } return 0;}

 

转载于:https://www.cnblogs.com/cton/p/3435507.html

你可能感兴趣的文章
7NiuYun云存储UploadPicture
查看>>
Window 的引导过程
查看>>
python与 Ajax跨域请求
查看>>
Java实体书写规范
查看>>
App右上角数字
查看>>
从.NET中委托写法的演变谈开去(上):委托与匿名方法
查看>>
六、PowerDesigner 正向工程 和 逆向工程 说明
查看>>
小算法
查看>>
201521123024 《java程序设计》 第12周学习总结
查看>>
贪吃蛇游戏改进
查看>>
新作《ASP.NET MVC 5框架揭秘》正式出版
查看>>
“前.NET Core时代”如何实现跨平台代码重用 ——源文件重用
查看>>
【POJ1845】Sumdiv(数论/约数和定理/等比数列二分求和)
查看>>
在WPF中使用Caliburn.Micro搭建MEF插件化开发框架
查看>>
IdentityServer4-用EF配置Client(一)
查看>>
UWP: 掌握编译型绑定 x:Bind
查看>>
asp.net core系列 35 EF保存数据(2) -- EF系列结束
查看>>
WPF程序加入3D模型
查看>>
WPF中实现多选ComboBox控件
查看>>
C++程序设计实践指导1.14字符串交叉插入改写要求实现
查看>>