当前位置:   article > 正文

从一道题目看蓝桥杯与ACM的区别_acm和蓝桥杯哪个难

acm和蓝桥杯哪个难

我不讨论蓝桥杯的好坏,也不吹捧acm,就从一道题目来看两者的区别。当然我并不是用前者的一道简单题和World final的真题来进行比较,不然就没有意义了,这篇博客的意义就在于前者和后者思考问题思路的不同之处。

废话说完,看题。蓝桥杯某题:一副扑克牌,去掉大小王,剩52张牌,均分给4人,每人13张牌,若不计花色,则这13张牌的可能序列有多少种?-->这原本是一道经典的多重集组合问题,用dp求解(秋叶拓哉--挑战程序竞赛),但还是从头开始看吧。

拿到题目,其一:固定的输入数据,其二:没有指明运行效率。于是诞生了第一种想法,暴力+for循环。

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <cstring>
  7. using namespace std;
  8. int main()
  9. {
  10. int i,t,ans=0,a[20];
  11. for (a[0]=0;a[0]<5;a[0]++)
  12. for (a[1]=0;a[1]<5;a[1]++)
  13. for (a[2]=0;a[2]<5;a[2]++)
  14. for (a[3]=0;a[3]<5;a[3]++)
  15. for (a[4]=0;a[4]<5;a[4]++)
  16. for (a[5]=0;a[5]<5;a[5]++)
  17. for (a[6]=0;a[6]<5;a[6]++)
  18. for (a[7]=0;a[7]<5;a[7]++)
  19. for (a[8]=0;a[8]<5;a[8]++)
  20. for (a[9]=0;a[9]<5;a[9]++)
  21. for (a[10]=0;a[10]<5;a[10]++)
  22. for (a[11]=0;a[11]<5;a[11]++)
  23. for (a[12]=0;a[12]<5;a[12]++)
  24. {
  25. t=0;
  26. for (i=0;i<13;i++) t+=a[i];
  27. if (t==13) ans++;
  28. }
  29. printf("%d",ans);
  30. return 0;
  31. }
引用了某钊的代码。

的确通俗易懂(QAQ)。

第一是如果是不固定的数据组数呢?for循环就没法解决了,但是谁让题目是死的呢。于是有了第二个思路,暴力+dfs

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. using namespace std;
  6. int res;
  7. void dfs(int number,int ans)
  8. {
  9. if(number==14)
  10. return ;
  11. if(ans==13)
  12. {
  13. res++;
  14. return;
  15. }
  16. for(int i=0;i<=4;i++)
  17. dfs(number+1,ans+i);
  18. }
  19. int main()
  20. {
  21. res=0;
  22. dfs(0,0);
  23. printf("%d\n",res);
  24. return 0;
  25. }
然后就是等待数秒后,会出现正确答案,注意,是等待数秒。用dfs的好处是,如果题目改变输入,也可灵活得到答案,其二,不用机械性的敲13个for循环。但是作为一个acmer,应该考虑的不是这些问题,而是如何设计出1s的程序。

于是诞生了DP求解此题:

一共13种牌,dp[i][j]表示在前i种中选取j张的可能情况。

状态转移方程:dp[i][j]=dp[i][j-k]+..d[i][j](k从0到min(j,a[i]))  a[i]表示每种牌的个数

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <algorithm>
  6. #include <vector>
  7. #include <queue>
  8. #include <map>
  9. using namespace std;
  10. #define rd(x) scanf("%d",&x)
  11. #define rd2(x,y) scanf("%d%d",&x,&y)
  12. #define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z)
  13. int dp[100][100];
  14. int w[100];
  15. void solve(int n,int m)
  16. {
  17. memset(dp,0,sizeof(dp));
  18. for(int i=0;i<=n;i++)
  19. dp[i][0]=1;
  20. for(int i=0;i<n;i++)
  21. for(int j=1;j<=m;j++)
  22. {
  23. for(int k=0;k<=min(j,w[i]);k++)
  24. dp[i+1][j]+=dp[i][j-k];
  25. }
  26. printf("%d\n",dp[n][m]);
  27. }
  28. //3598180
  29. int main()
  30. {
  31. int n,m;
  32. while(~rd2(n,m))
  33. {
  34. for(int i=0;i<n;i++)
  35. rd(w[i]);
  36. solve(n,m);
  37. }
  38. return 0;
  39. }
此时,已经能高效的运行了,这才是真正的程序,当然还有改进之处,原来时间复杂度为O(nm^2),状态转移方程还是可以优化的。

dp[i+1][j]=dp[i+1][j-1]+dp[i][j]-dp[i][j-1-ai]

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <algorithm>
  6. #include <vector>
  7. #include <queue>
  8. #include <map>
  9. using namespace std;
  10. #define rd(x) scanf("%d",&x)
  11. #define rd2(x,y) scanf("%d%d",&x,&y)
  12. #define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z)
  13. const int M=10000007;
  14. int dp[100][100];
  15. int w[100];
  16. void solve(int n,int m)
  17. {
  18. memset(dp,0,sizeof(dp));
  19. for(int i=0;i<=n;i++)
  20. dp[i][0]=1;
  21. for(int i=0;i<n;i++)
  22. for(int j=1;j<=m;j++)
  23. {
  24. if(j-1-w[i]>=0)
  25. dp[i+1][j]=(dp[i+1][j-1]+dp[i][j]-dp[i][j-1-w[i]]+M)%M;
  26. else
  27. dp[i+1][j]=dp[i+1][j-1]+dp[i][j];
  28. }
  29. printf("%d\n",dp[n][m]);
  30. }
  31. //3598180
  32. int main()
  33. {
  34. int n,m;
  35. while(~rd2(n,m))
  36. {
  37. for(int i=0;i<n;i++)
  38. rd(w[i]);
  39. solve(n,m);
  40. }
  41. return 0;
  42. }
这样复杂度讲到了O(nm),参考(秋叶拓哉)的多重集组合数章节。

怎么说呢,蓝桥杯也并不是水,考的比较差的我也没这个资格说,但是对于一直在刷acm题的我来说,也让我发现了很多漏洞,好比说,经典的dfs还没有掌握,dp的知识也暂时没有涉及太多,树形dp,状压dp.etc 都还没做。总之我感觉acm更多的是锻炼人的思维,而蓝桥杯则更偏向于对经典算法的涉猎程度,当然我并不是说acm涉猎不广,两者的难度我相信不用我比较也是不言而喻的,那么就借此题给之前自以为是的我画个句号吧。




声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/683454
推荐阅读
相关标签
  

闽ICP备14008679号