24dian(牛客多校第三场)

Posted Jozky86

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了24dian(牛客多校第三场)相关的知识,希望对你有一定的参考价值。

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(牛客多校第三场)的主要内容,如果未能解决你的问题,请参考以下文章

22年牛客多校第三场(F的证明

2021牛客多校3 - 24dian(dfs)

牛客2018暑假多校第三场A PACM Team(01背包+纪录路径)

2019牛客多校第一场

2022牛客多校第一场ACDGIJ

2022牛客多校第一场ACDGIJ