网店推广方案,seo排名优化联系13火星软件,广州 flash 网站,免费学设计的网站第一题#xff1a;生日蛋糕 题解#xff1a;这题是蛋糕结构是一层一层的#xff0c;估计很多人很快就能想到是dfs#xff0c;但是这题的难想的点在于
你每层的状态该怎么去确定#xff0c;你怎么来确定每层的半径和高度是多少#xff0c;一开始我也不知很理解#xff0…第一题生日蛋糕 题解这题是蛋糕结构是一层一层的估计很多人很快就能想到是dfs但是这题的难想的点在于
你每层的状态该怎么去确定你怎么来确定每层的半径和高度是多少一开始我也不知很理解直到在网上看到了一篇大佬的博客才让我茅塞顿开我干嘛非要确定呢全用最小的不就好了因此我们要写出每层的最小的体积和面积然后用前缀和累加起来然后三个剪枝代码里有注释减少运算就可以愉快的AC了
#includeiostream
#includecstring
#includecstdio
#include queue
#includemath.h
using namespace std;
int n,m;
int sums[16];
int sumv[16];
int sum0x7fffffff;//记录最小的值 void dfs(int t,int s,int v,int r,int h)
{if(t0){if(ssumvn){sums;}return ;}if(ssums[t]sum)//第一个剪枝你目前的面积加上上面层的最小的面积已知面积可以直接跳过return ;if(vsumv[t]n)//第二个剪枝你目前的体积加上上面层的最小的体积要求的体积可以直接跳过return ;if(s2*(n-v)/rsum)//第三个剪枝你把所有体积都做成一层蛋糕如果面积已知面积跳过return ;for(int ir-1;it;i--){if(tm)si*i;int h1min(h-1,(n-v-sumv[t-1])/(i*i));for(int jh1;jt;j--){dfs(t-1,s2*i*j,vi*i*j,i,j);}}return ;
}
int main()
{scanf(%d%d,n,m);for(int i1;im;i){sumv[i]sumv[i-1]i*i*i;sums[i]sums[i-1]2*i*i;}dfs(m,0,0,sqrt((double)n)1,n);if(sum0x7fffffff){printf(0);return 0;}printf(%d,sum);return 0;
}
第二题速算24 题解这题一开始也卡了我好久我一直不明白哪里错了后面问了学长但是还是自己想出来为什么错了因为有可能二三进行运算这样的话就会漏掉情况所以一开始一直过不了然后写出来了还用到了全排列函数不会的可以去了解一下AC代码
#includeiostream
#includealgorithm
#includecstring
#includecstdio
#includecmath
using namespace std;char s[5]{0};
int num[5]{0};
int flag0;void dfs(int sum,int count,int nextt)
{if(flag1)return ;if(count3){if(sumnextt24)flag1;if(sum-nextt24)flag1;if(sum*nextt24)flag1;if(nextt!0sum%nextt0sum/nextt24)flag1;return ;}dfs(sumnextt,count1,num[count1]);dfs(sum-nextt,count1,num[count1]);dfs(sum*nextt,count1,num[count1]);if(nextt!0sum%nextt0){dfs(sum/nextt,count1,num[count1]);}dfs(sum,count1,nexttnum[count1]);dfs(sum,count1,nextt-num[count1]);dfs(sum,count1,nextt*num[count1]);if(num[count1]!0nextt%num[count1]0){dfs(sum,count1,nextt/num[count1]);}
// dfs(sumnextt,count1,num[count1]);
// dfs(sum-nextt,count1,num[count1]);
// dfs(sum*nextt,count1,num[count1]);
// if(sum%nextt0nextt!0)
// {
// dfs(sum/nextt,count1,num[count1]);
// }
// dfs(sum,count1,nexttnum[count1]);
// dfs(sum,count1,nextt-num[count1]);
// dfs(sum,count1,nextt*num[count1]);
// if(nextt%num[count1]0num[count1]!0)
// {
// dfs(sum,count1,nextt/num[count1]);
// }
}int main()
{while (~scanf(%s, s)){flag 0;if (strlen(s) 2)num[0] 10;else{if (s[0] A)num[0] 1;else if (s[0] J)num[0] 11;else if (s[0] Q)num[0] 12;else if (s[0] K)num[0] 13;elsenum[0] s[0] - 0;}for (int i 1; i 4; i){scanf(%s, s);if (strlen(s) 2)num[i] 10;else{if (s[0] A)num[i] 1;else if (s[0] J)num[i] 11;else if (s[0] Q)num[i] 12;else if (s[0] K)num[i] 13;elsenum[i] s[0] - 0;}}flag0;sort(num,num4);do{dfs(num[0],1,num[1]);}while(next_permutation(num,num4)flag0);if (flag 1)printf(Yes\n);elseprintf(No\n);}return 0;
}