B - Make Numbers Gym - 102835B(表示式,暴力)
題意:
四個數字,可以改變順序,中間可以新增+,-,*符號。數字之間還可以合併成一個數。
求最終能生成多少個數字。
思路:
暴力列舉生成了哪幾個數,再列舉這幾個數之間符號是啥,再用棧算出這個結果,用set去重。
寫的賊麻煩,快麻了。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
set<int>st;
int get(deque<pair<int,int>>que) {
deque<pair<int,int>>d = que;
deque<pair<int,int>>now;
while(!que.empty()) {
pair<int,int>num = que.front();que.pop_front();
if(num.first == 1 && num.second == 2) {
pair<int,int>nex = que.front();que.pop_front();
pair<int,int>pre = now.back();now.pop_back();
int number = nex.second * pre.second;
now.push_back({0,number});
} else {
now.push_back(num);
}
}
que = now;
now.clear();
while(!que.empty()) {
pair<int,int>num = que.front();que.pop_front();
if(num.first == 1) {
if(num.second == 0) {
pair<int, int> nex = que.front();
que.pop_front();
pair<int, int> pre = now.back();
now.pop_back();
int number = nex.second + pre.second;
now.push_back({0,number});
} else if(num.second == 1) {
pair<int, int> nex = que.front();
que.pop_front();
pair<int, int> pre = now.back();
now.pop_back();
int number = pre.second - nex.second;
now.push_back({0,number});
}
} else {
now.push_back(num);
}
}
return now.front().second;
}
void fuhao(int id,vector<int>v,deque<pair<int,int>>que) {
if(id == v.size() - 1) {
que.push_back({0,v[id]});
int num = get(que);
if(num >= 0) {
st.insert(num);
}
return ;
}
que.push_back({0,v[id]});
for(int i = 0;i < 3;i++) { //+ - *
que.push_back({1,i});
fuhao(id + 1,v,que);
que.pop_back();
}
}
void cal(vector<int>v) {
if(v.size() == 1) return;
deque<pair<int,int>>que;
fuhao(0,v,que);
}
vector<vector<int>>vec;
int a[10];
void dfs(int id,int now,vector<int>v) {
if(id == 5) {
if(now) v.push_back(now);
vec.push_back(v);
return;
}
if(now) v.push_back(now);
dfs(id + 1,a[id],v);
if(now) v.pop_back();
now = now * 10 + a[id];
dfs(id + 1,now,v);
}
int main() {
scanf("%d%d%d%d",&a[1],&a[2],&a[3],&a[4]);
sort(a + 1,a + 1 + 4);
do {
vector<int> v;
dfs(1, 0, v);
}while(next_permutation(a + 1,a + 1 + 4));
for(int i = 0;i < vec.size();i++) {
cal(vec[i]);
}
printf("%d\n",st.size());
return 0;
}
相關文章
- B - Make Many Triangles
- B. Numbers Box(思維)
- 正規表示式 \b元字元字元
- 正規表示式 \B 元字元字元
- CF.1416B. Make Them Equal
- [藍橋杯 2019 省 B] 字尾表示式
- 控制make的函式函式
- Go 語言 -make函式Go函式
- gym建立環境、自定義gym環境
- PostgreSQL 原始碼解讀(58)- 查詢語句#43(make_one_rel函式#8-B...SQL原始碼函式
- PostgreSQL 原始碼解讀(59)- 查詢語句#44(make_one_rel函式#9-B...SQL原始碼函式
- 表示式
- 中綴表示式轉字尾表示式
- Reversed Numbers
- 400多種Numbers模板 DesiGN for Numbers Templates for macMac
- cron表示式
- lambda 表示式
- lambda表示式
- 表示式樹
- Cron 表示式
- JavaScript 表示式JavaScript
- el 表示式
- PAT-B 1088 三人行【暴力列舉】
- 中綴表示式轉為逆波蘭表示式
- Collecting Numbers II
- Codeforces - Jzzhu and Numbers
- gym100299H
- 搭建gym環境
- javascript-函式表示式JavaScript函式
- 函式表示式–遞迴函式遞迴
- “正規表示式”應當稱為“規則表示式”
- ./configure,make,make install的作用
- 正規表示式
- 八,Lambda表示式
- 中綴表示式
- Python Lambda 表示式Python
- 三目表示式
- Java Lambda表示式Java