24dian(牛客多校第三场)
生活随笔
收集整理的這篇文章主要介紹了
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(牛客多校第三场)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 变频空调怎么省电 有什么省电的方法
- 下一篇: 做酸奶用什么发酵 自己做酸奶用什么发酵