24dian(牛客多校第三场)
Posted Jozky86
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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("");
}
}
以上是关于24dian(牛客多校第三场)的主要内容,如果未能解决你的问题,请参考以下文章