题目总结:
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;}