B - Make Numbers Gym - 102835B ###K //K

题目链接:https://vjudge.net/contest/407655#problem/B
题意:给定4位 1~9数字  问如何组合 并且至少用+ - * 的其中一种符号得到的不相同非负整数的数量
思路:考虑所有的符号组合以及数字的排列组合 全部求一遍, 没必要去想符号和数字同时排列这样会不会重复求了

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define pb push_back
 4 #define ll long long
 5 const int maxn=2e5+10;
 6 const int mod=1e9+7;
 7 int e[5];
 8 map<int,int>mp;
 9 int solve2(int a,int b)
10 {
11     mp[a+b]=1,mp[a-b]=1,mp[a*b]=1;
12 }
13 int solve3(int a,int b,int c)
14 {
15     mp[a+b+c]=1,mp[a+b-c]=1,mp[a+b*c]=1;
16     mp[a-b+c]=1,mp[a-b-c]=1,mp[a-b*c]=1;
17     mp[a*b+c]=1,mp[a*b-c]=1,mp[a*b*c]=1;
18 }
19 int solve4(int a,int b,int c,int d)
20 {
21     mp[a+b+c+d]=1,mp[a+b+c-d]=1,mp[a+b+c*d]=1;
22     mp[a+b-c+d]=1,mp[a+b-c-d]=1,mp[a+b-c*d]=1;
23     mp[a+b*c+d]=1,mp[a+b*c-d]=1,mp[a+b*c*d]=1;
24 
25     mp[a-b+c+d]=1,mp[a-b+c-d]=1,mp[a-b+c*d]=1;
26     mp[a-b-c+d]=1,mp[a-b-c-d]=1,mp[a-b-c*d]=1;
27     mp[a-b*c+d]=1,mp[a-b*c-d]=1,mp[a-b*c*d]=1;
28 
29     mp[a*b+c+d]=1,mp[a*b+c-d]=1,mp[a*b+c*d]=1;
30     mp[a*b-c+d]=1,mp[a*b-c-d]=1,mp[a*b-c*d]=1;
31     mp[a*b*c+d]=1,mp[a*b*c-d]=1,mp[a*b*c*d]=1;
32 }
33 
34 int main()
35 {
36     ios::sync_with_stdio(0);
37     cin.tie(0);
38     for(int i=1;i<=4;i++)
39         cin>>e[i];
40     sort(e+1,e+1+4);
41     do
42     {
43         solve2(e[1],e[2]*100+e[3]*10+e[4]);
44         solve2(e[1]*10+e[2],e[3]*10+e[4]);
45         solve2(e[1]*100+e[2]*10+e[3],e[4]);
46 
47         solve3(e[1],e[2],e[3]*10+e[4]);
48         solve3(e[1],e[2]*10+e[3],e[4]);
49         solve3(e[1]*10+e[2],e[3],e[4]);
50 
51         solve4(e[1],e[2],e[3],e[4]);
52     }
53     while(next_permutation(e+1,e+1+4));
54     int sum=0;
55     for(int i=0;i<=10000;i++)
56     {
57         if(mp[i])
58             sum++;
59     }
60     cout<<sum<<'\n';
61 
62 }
View Code

 

posted @ 2020-11-15 00:45  canwinfor  阅读(207)  评论(0)    收藏  举报