当前位置:   article > 正文

蓝桥杯2014年第五届C/C++ B组省赛习题题解_2014年 蓝桥杯 c++

2014年 蓝桥杯 c++

目录

第一题:啤酒和饮料(枚举)

第二题:切面条(数学)

第三题:李白打酒(dfs)

第四题:史丰收速算

第五题:打印图形

第六题:奇怪的分式(枚举)

 第七题:六角填数

第八题:蚂蚁感冒(数学)

第九题:地宫取宝

第十题:小朋友排队(树状数组)


题目来源:

2014年第五届C/C++ B组蓝桥杯省赛真题_元气算法的博客-CSDN博客

第一题:啤酒和饮料(枚举)

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. for (int i = 0; i < 82.3 / 2.3; i++)
  6. {
  7. for (int j = 0; j < 82.3/1.9; j++)
  8. {
  9. if (2.3 * i + 1.9 * j == 82.3)
  10. {
  11. cout << i << endl;
  12. return 0;
  13. }
  14. }
  15. }
  16. }

第二题:切面条(数学)

 解析:

2014年第五届C/C++ B组蓝桥杯省赛真题_元气算法的博客-CSDN博客

  1. #include<iostream>
  2. #include<cmath>
  3. using namespace std;
  4. int main()
  5. {
  6. //计算对折拐弯处数目(等比公式推导)
  7. int a = pow(2,10)-1;
  8. //无对折情况下数目
  9. int b = pow(2,11);
  10. //最后面条数目
  11. cout << b-a;
  12. return 0;
  13. }

第三题:李白打酒(dfs)

  1. #include<iostream>
  2. using namespace std;
  3. int ans;
  4. void dfs(int x, int y, int z)
  5. {
  6. if (x < 0 || y < 0) return;
  7. if (x == 0 && y == 1 && z == 1) ans++;
  8. if (x > 0) dfs(x - 1, y, z * 2);
  9. if (y > 0) dfs(x, y - 1, z - 1);
  10. }
  11. int main()
  12. {
  13. dfs(5, 10, 2);
  14. cout << ans;
  15. return 0;
  16. }

第四题:史丰收速算

  1. //计算个位
  2. int ge_wei(int a)
  3. {
  4. if(a % 2 == 0)
  5. return (a * 2) % 10;
  6. else
  7. return (a * 2 + 5) % 10;
  8. }
  9. //计算进位
  10. int jin_wei(char* p)
  11. {
  12. char* level[] = {
  13. "142857",
  14. "285714",
  15. "428571",
  16. "571428",
  17. "714285",
  18. "857142"
  19. };
  20. char buf[7];
  21. buf[6] = '\0';
  22. strncpy(buf,p,6);
  23. int i;
  24. for(i=5; i>=0; i--){
  25. int r = strcmp(level[i], buf);
  26. if(r<0) return i+1;
  27. while(r==0){
  28. p += 6;
  29. strncpy(buf,p,6);
  30. r = strcmp(level[i], buf);
  31. if(r<0) return i+1;
  32. ______________________________; //填空
  33. }
  34. }
  35. return 0;
  36. }
  37. //多位数乘以7
  38. void f(char* s)
  39. {
  40. int head = jin_wei(s);
  41. if(head > 0) printf("%d", head);
  42. char* p = s;
  43. while(*p){
  44. int a = (*p-'0');
  45. int x = (ge_wei(a) + jin_wei(p+1)) % 10;
  46. printf("%d",x);
  47. p++;
  48. }
  49. printf("\n");
  50. }
  51. int main()
  52. {
  53. f("428571428571");
  54. f("34553834937543");
  55. return 0;
  56. }

解析:

函数名已经写得很清楚了:进位

既然有进那么就有不进位:答案为:

if(r>0) return i;


第五题:打印图形

2014年第五届C/C++ B组蓝桥杯省赛真题_元气算法的博客-CSDN博客


第六题:奇怪的分式(枚举)

 

  1. #include<iostream>
  2. #include<cmath>
  3. using namespace std;
  4. int main()
  5. {
  6. int cnt = 0;
  7. for(int a = 1; a < 10; a++)
  8. {
  9. for(int b = 1; b < 10; b++)
  10. {
  11. //满足分子分母不同
  12. if(a!=b)
  13. for(int c = 1; c < 10; c++)
  14. {
  15. for(int d = 1; d < 10; d++)
  16. {
  17. if(c!=d)
  18. {
  19. //浮点数判断相等
  20. if(fabs(a*c*1.0/(b*d)-(a*10.0+c)/(b*10+d))<1e-5)
  21. {
  22. cnt++;
  23. }
  24. }
  25. }
  26. }
  27. }
  28. }
  29. cout<< cnt <<endl;
  30. return 0;
  31. }


 第七题:六角填数

 

 解析:

第五届蓝桥杯——六角填数_业余算法学徒的博客-CSDN博客

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. int main()
  5. {
  6. int a[9] = {2, 4, 5, 6, 7, 9, 10, 11, 12};
  7. do
  8. {
  9. int L1 = 1 + a[0] + a[3] + a[5];
  10. int L2 = 1 + a[1] + a[4] + a[8];
  11. int L3 = a[5] + a[6] + a[7] +a[8];
  12. int L4 = 8 + a[0] + a[1] + a[2];
  13. int L5 = 8 + a[3] + a[6] + 3;
  14. int L6 = a[2] + a[4] + a[7] + 3;
  15. if(L1 == L2 && L1 == L3 && L1 == L4 && L1 == L5 && L1 == L6) cout << a[3] << endl;
  16. }while(next_permutation(a, a + 9));
  17. return 0;
  18. }

第八题:蚂蚁感冒(数学)

 

  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. const int N=55;
  5. int x[N];
  6. int n;
  7. int main()
  8. {
  9. cin>>n;
  10. for(int i=0;i<n;i++) cin>>x[i];
  11. int left=0,right=0;//左边向右走的:x[i]>0,且abs小于x[0],和右边向左走的:x[i]<0,且abs大于x[0]
  12. for(int i=1;i<n;i++)
  13. {
  14. if(abs(x[i])<abs(x[0]) && x[i]>0) left++;
  15. else if(abs(x[i])>abs(x[0]) && x[i]<0) right++;
  16. }
  17. if(x[0]>0 && right==0 || x[0]<0 && left==0) cout<<1<<endl;
  18. else cout<<left+right+1<<endl;
  19. return 0;
  20. }

第九题:地宫取宝

 

  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int MOD = 1000000007, N = 55;
  6. int map[N][N];//地图的值
  7. int dp[N][N][13][14];//DP[A][B][C][D] AB横纵坐标 C数量 D最后一个为D的价值
  8. int main()
  9. {
  10. int n, m, k;//n m横纵数量 k K件宝物
  11. cin >> n >> m >> k;
  12. for (int i = 1; i <= n; i++)
  13. for (int j = 1; j <= m; j++)
  14. {
  15. cin >> map[i][j];
  16. map[i][j]++;
  17. }//读入地图宝物价值,为了方便初始下标判断,全加1
  18. dp[1][1][1][map[1][1]] = 1;//起始点选择 方案数1
  19. dp[1][1][0][0] = 1;//起始点不选 方案数1
  20. for (int i = 1; i <= n; i++)
  21. {
  22. for (int j = 1; j <= m; j++)
  23. {
  24. if (i == 1 && j == 1)continue;//如果是起始点 跳过
  25. for (int u = 0; u < 13; u++)
  26. for (int v = 0; v < 14; v++)
  27. {
  28. int& val = dp[i][j][u][v];//引用 简化
  29. val = (val + dp[i - 1][j][u][v]) % MOD;//左边 不选
  30. val = (val + dp[i][j - 1][u][v]) % MOD;//上边 不选
  31. if (u > 0 && v == map[i][j])//最终的选择到了最大的价值宝物(因为题目递增),且有选择次数,则累加不同价值的子集
  32. //当前的方案数量=上一步的所有价值的方案数量之和
  33. {
  34. for (int c = 0; c < v; c++)//
  35. {
  36. val = (val + dp[i - 1][j][u - 1][c]) % MOD;//左边
  37. val = (val + dp[i][j - 1][u - 1][c]) % MOD;//上边
  38. }
  39. }
  40. }
  41. }
  42. }
  43. int res = 0;
  44. for (int i = 1; i <= 13; i++)res = (res + dp[n][m][k][i]) % MOD;//总方案数量等于当前数量下所有价值的数量总和
  45. cout << res;
  46. return 0;
  47. }

第十题:小朋友排队(树状数组

 

 解析:

活动 - AcWing

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N = 1000010;
  7. int n;
  8. long long a[N], tr[N], b[N];
  9. int lowbit(int x)
  10. {
  11. return x & -x;
  12. }
  13. void add(int x, int y)
  14. {
  15. for (int i = x; i < N; i += lowbit(i)) tr[i] += y;
  16. }
  17. int query(int x)
  18. {
  19. int ans = 0;
  20. for (int i = x; i; i -= lowbit(i)) ans += tr[i];
  21. return ans;
  22. }
  23. int main()
  24. {
  25. cin >> n;
  26. for (int i = 1; i <= n; i++)
  27. {
  28. cin >> a[i];
  29. a[i]++;
  30. }
  31. for (int i = 1; i <= n; i++)
  32. {
  33. add(a[i], 1);
  34. b[i] = i - query(a[i]);
  35. }
  36. memset(tr, 0, sizeof tr);
  37. for (int i = n; i >= 1; i--)
  38. {
  39. add(a[i], 1);
  40. b[i] += query(a[i] - 1);
  41. }
  42. long long res = 0;
  43. for (int i = 1; i <= n; i++)
  44. {
  45. res += (1 + b[i]) * b[i] / 2;
  46. }
  47. cout << res << endl;
  48. return 0;
  49. }

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

闽ICP备14008679号