24dian(牛客多校第三场)
题意:
给你n张牌,每张牌的大小为1 ~ 13,问这些牌与加减乘除任意组合(可以使用括号),且但所有的有效解在计算过程中都涉及到分数,即非整数,能否组成答案m,如果可以,输出所有牌的情况
题解:
直接按照题意模拟,这里是大佬代码
注意题意:一个有效解,其所有能得到m的组合方式,其中都要设计到分数(即非整数)
建议多打几遍。。emm
代码中有详细注释
代码:
#include<bits/stdc++.h>
using namespace std;
vector<double>v,ans[100009];
int n,m,flag,cnt,num;
bool judge(double x,double y) {//判断是否为整数 if (x>(int)x+1e-9) return 1;if (y>(int)y+1e-9) return 1;if (x/y>(int)(x/y)+1e-9) return 1;return 0;
}
void DFS2(int x,int qwq,vector<double> v) {if (x==n) {//符号已满 if (fabs(v[0]-m)<1e-8) {++flag;//所有能求出m的方案 if (qwq) ++cnt;//存在非整数的解的情况 }return;}int sz=v.size();for (int i=0; i<sz; ++i)for (int j=0; j<sz; ++j) {if (i==j) continue;vector<double> tmp; tmp.clear();//任选两个值进行运算的结果存入tmp//其他值不变存入tmp中 for (int k=0; k<sz; ++k)if (k!=i && k!=j) tmp.push_back(v[k]);tmp.push_back(v[i]+v[j]);DFS2(x+1,qwq,tmp);tmp.pop_back();tmp.push_back(v[i]-v[j]);DFS2(x+1,qwq,tmp);tmp.pop_back();tmp.push_back(v[i]*v[j]);DFS2(x+1,qwq,tmp);tmp.pop_back();tmp.push_back(v[i]/v[j]);DFS2(x+1,qwq|judge(v[i],v[j]),tmp);tmp.pop_back(); }
}
bool check(vector<double> v) {flag=0; cnt=0;DFS2(1,0,v);//flag==cnt说明是所有解都包含非整数 if (flag==cnt && cnt) return 1;return 0;
}
void DFS1(int x,int pre) {if (x==n+1) {//牌数已满 if (check(v)) {ans[num++]=v;}return;}for (int i=pre; i<=13; ++i) {v.push_back(i);DFS1(x+1,i);v.pop_back();}
}
int main() {cin>>n>>m;DFS1(1,1);cout<<num<<endl;for (int i=0; i<num; ++i) {int sz=ans[i].size();for (int j=0; j<sz; ++j) cout<<ans[i][j]<<' ';puts("");}
}