一副牌,除了大小王之外还有52张,从1到13每个数目各有四张。要求设计一个程序,对于任意给出52张牌中的四张,运用+-×÷四种运算来判断能否每个数只能用一次,但不能不用,算出24来。注意,给出的4个数是无序的。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
double a[4];
double sum(double x,double y,int k)
{
if(k==1) return x+y;
else if(k==2) return x-y;
else if(k==3) return x*y;
else
{
if(fabs(y-0)>1e-6) return x/y; //x,y竟然可以是分数
else return -1000000;
}
}
int main(){
while(~scanf("%lf %lf %lf %lf",&a[0],&a[1],&a[2],&a[3]))
{
int flag=0;
sort(a,a+4);
do
{
for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) for(int k=1;k<=4;k++)
{
double s1 = sum(sum(sum(a[0],a[1],i),a[2],j),a[3],k); //(((0,1),2),3)
double s2 = sum(sum(a[0],a[1],i),sum(a[2],a[3],k),j); //((0,1),(2,3))
double s3 = sum(sum(a[0],sum(a[1],a[2],i),j),a[3],k); //((0,(1,2)),3)
double s4 = sum(a[0],sum(sum(a[1],a[2],j),a[3],k),i); //(0,((1,2),3))
double s5 = sum(a[0],sum(a[1],sum(a[2],a[3],k),j),i); //(0,(1,(2,3)))
if((fabs(s1-24)<1e-6) || (fabs(s2-24)<1e-6) || (fabs(s3-24)<1e-6) || (fabs(s4-24)<1e-6) || (fabs(s5-24)<1e-6) )
{
flag=1;
break;
}
}
}while(next_permutation(a,a+4));
if(flag) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}
//3 3 8 8