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 }

浙公网安备 33010602011771号