标签:
2424点就是给你一串数字,问你是否通过加减乘除括号构成2424点。
沈爷觉得这个很好玩,就决定考考你,给你44个数,可以交换位置,可以用加减乘除和括号,是否能构成2424点呢?
注意哦~这里的除法并不是整数除法,比如样例
第一行TT,表示有多少组测试数据,1≤T≤501≤T≤50
接下来TT行,每行44个正整数a1a1, a2a2, a3a3, a4a4,表示每个数都是多少,1≤ai≤131≤ai≤13
对于每一次询问,如果能够凑成2424点,输出yes
,否则输出no
Sample Input | Sample Output |
---|---|
2 3 3 8 8 1 1 1 1 |
yes no |
33 33 88 88
就可以构造出 8÷(3–8÷3)=24
题解:求24点,暴力搜索下就好,刚开始我想着全排列下,然后按照顺序来进行,但是思路明显不完善,然后看了大神的,
大神是延长数组存放当前运算的解,vis记录是否用过,思路很巧妙;很简单就A过了;
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<map> #include<string> #include<vector> using namespace std; const int INF=0x3f3f3f3f; #define SI(x) scanf("%d",&x) #define PI(x) printf("%d",x) #define P_ printf(" ") #define mem(x,y) memset(x,y,sizeof(x)) typedef long long LL; int flot; double a[110]; int vis[110]; /*void dfs(int pos,double cur); void ary(int num){ if(flot)return; if(num==4){ // for(int i=0;i<4;i++)printf("%d ",ans[i]);puts(""); dfs(1,ans[0]); return; } for(int i=0;i<4;i++){ if(vis[i])continue; ans[num]=a[i]; vis[i]=1; ary(num+1); vis[i]=0; } } */ void dfs(int usd,int tp){ if(flot)return; if(usd==4){ if(abs(a[tp-1]-24)<1e-8)flot=1; return; } /* dfs(pos+1,cur+ans[pos]); dfs(pos+1,cur-ans[pos]); dfs(pos+1,cur*ans[pos]); dfs(pos+1,cur/ans[pos]); dfs(pos+1,-cur*ans[pos]); dfs(pos+1,-cur/ans[pos]); dfs(pos+1,ans[pos]/cur); dfs(pos+1,ans[pos]/cur); */ for(int i=0;i<tp;i++){ if(vis[i])continue; vis[i]=1; for(int j=i+1;j<tp;j++){ if(vis[j])continue; vis[j]=1; a[tp]=a[i]+a[j];dfs(usd+1,tp+1); a[tp]=a[i]*a[j];dfs(usd+1,tp+1); a[tp]=a[i]-a[j];dfs(usd+1,tp+1); a[tp]=a[j]-a[i];dfs(usd+1,tp+1); if(a[i]!=0){ a[tp]=a[j]/a[i];dfs(usd+1,tp+1); } if(a[j]!=0){ a[tp]=a[i]/a[j];dfs(usd+1,tp+1); } vis[j]=0; } vis[i]=0; } } int main(){ int T; SI(T); while(T--){ for(int i=0;i<4;i++)scanf("%lf",&a[i]); flot=0; mem(vis,0); dfs(1,4); if(flot)puts("yes"); else puts("no"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/handsomecui/p/5259507.html