当前位置:   article > 正文

蓝桥杯2020年c++B组真题【省赛】

蓝桥杯2020年c++B组真题【省赛】

一、门牌制作

 

思路:枚举每一位数,看是否等于2,是的话++;

  1. #include<iostream>
  2. using namespace std;
  3. int ans;
  4. void solve(int k)
  5. {
  6. while (k > 0)
  7. {
  8. int m = k % 10;
  9. k /= 10;
  10. if (m == 2)
  11. {
  12. ans++;
  13. }
  14. }
  15. }
  16. int main()
  17. {
  18. for (int i = 1; i <= 2020; i++)
  19. {
  20. solve(i);
  21. }
  22. cout << ans << endl;
  23. return 0;
  24. }

二、既约分数

 

思路;利用gcd函数,枚举数字后判断是否 符合条件,最后乘二(因为数字可以上下交换)再加一(记得算上1/1)的情况。

  1. #include<iostream>
  2. using namespace std;
  3. int gcd(int a,int b) {
  4. return b>0 ? gcd(b,a%b):a;
  5. }
  6. int main()
  7. {
  8. long long int cnt=0;
  9. for(int i=1;i<=2020;i++){
  10. for(int j=i+1;j<=2020;j++){
  11. if(gcd(i,j)==1) cnt++;
  12. }
  13. }
  14. cout<<cnt*2+1;
  15. return 0;
  16. }

三、蛇形填数

 

思路:找规律,n+1行的数等于第n行数字加n*(n-1). 

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main() {
  4. int step = 4, n = 1, res = 1;
  5. while(res ++) {
  6. if(res == 21) break;
  7. n += step; step += 4;
  8. }
  9. cout << n << endl;
  10. return 0;
  11. }

 四、七段码

 

思路;判断二极管是否相连,可以先用二维数组标记两两相连的二极管,再枚举亮灯的情况,利用深搜(dfs)判断枚举出的灯是否相连,再利用并查集将相连的二极管块连在一起,最后判断是否只有一组数据,是的话说明所有二极管都连在了一起。 

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. const int MAXN = 25;
  5. int n = 7, ans = 0, path[MAXN], f[MAXN][MAXN], father[MAXN];
  6. int find(int x)
  7. {
  8. if (x != father[x]) {
  9. return father[x] = find(father[x]);
  10. }
  11. return father[x];
  12. }
  13. void dfs(int u, int p, int m)
  14. {
  15. if (u == m) {
  16. for (int i = 1; i < MAXN; ++i) {
  17. father[i] = i;
  18. }
  19. for (int i = 0; i < m; ++i) {
  20. for (int j = i + 1; j < m; ++j) {
  21. //存在边相连
  22. if (f[path[i]][path[j]] == 1) {
  23. //path[i] 和 path[j] 合并成一个集合
  24. father[find(path[i])] = find(father[path[j]]);
  25. }
  26. }
  27. }
  28. bool flag = false;
  29. for (int i = 0; i < m - 1; ++i) {
  30. if (find(path[i]) != find(path[i + 1])) {
  31. flag = true;
  32. break;
  33. }
  34. }
  35. if (!flag) {
  36. ++ans;
  37. }
  38. return ;
  39. }
  40. for (int i = p; i <= n; ++i) {
  41. path[u] = i;
  42. dfs(u + 1, i + 1, m);
  43. }
  44. }
  45. int main()
  46. {
  47. //A B C D E F G
  48. //1 2 3 4 5 6 7
  49. memset(f, 0, sizeof(f));
  50. f[1][2] = f[2][1] = 1;
  51. f[1][6] = f[6][1] = 1;
  52. f[2][7] = f[7][2] = 1;
  53. f[6][7] = f[7][6] = 1;
  54. f[7][3] = f[3][7] = 1;
  55. f[7][5] = f[5][7] = 1;
  56. f[2][3] = f[3][2] = 1;
  57. f[3][4] = f[4][3] = 1;
  58. f[4][5] = f[5][4] = 1;
  59. f[5][6] = f[6][5] = 1;
  60. for (int i = 1; i <= n; ++i) {
  61. dfs(0, 1, i);
  62. }
  63. cout << ans << endl;
  64. return 0;
  65. }

五、跑步锻炼

  思路:模拟,但是要注意闰年的判断和每个月的月数。

  1. #include<iostream>
  2. using namespace std;
  3. int ants = 0;
  4. int Month[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
  5. int main()
  6. {
  7. int year = 2000, month = 1, day = 1, weekday = 6;
  8. while (1)
  9. {
  10. ants += (weekday == 1 || day == 1) + 1;
  11. if (year == 2020 && month == 10 && day == 1)
  12. {
  13. break;
  14. }
  15. day += 1;
  16. weekday = (weekday + 1) % 7;
  17. if (month == 2 && (year % 4 == 0 && year % 100 != 0 || year % 400 == 0))
  18. {
  19. if (day > Month[month] + 1)
  20. {
  21. day = 1;
  22. month += 1;
  23. }
  24. }
  25. else if (day > Month[month])
  26. {
  27. day = 1;
  28. month += 1;
  29. }
  30. if (month == 13)
  31. {
  32. month = 1;
  33. year += 1;
  34. }
  35. }
  36. cout << ants << endl;
  37. return 0;
  38. }

六、回文日期

 思路:需要用字符串和数字之间的转换,然后判断一个日期是否是回文串,日期是否合法,在前面的基础上再判断是否是ABBABABA即可。

  1. #include <iostream>
  2. #include <string>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <sstream>
  6. #include <bits/stdc++.h>
  7. using namespace std;
  8. int data;
  9. int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
  10. bool fun(int n){
  11. string s="";
  12. while(n){
  13. int temp=n%10;
  14. s+=temp-'0';
  15. n/=10;
  16. }
  17. string m=s;
  18. reverse(s.begin(),s.end());
  19. return m==s?true:false;
  20. }
  21. bool sfun(int n){
  22. string s="";
  23. while(n){
  24. int temp=n%10;
  25. s+=temp-'0';
  26. n/=10;
  27. }
  28. string m=s;
  29. reverse(s.begin(),s.end());
  30. if(s!=m) return false;
  31. if(s[2]!=s[0]) return false;
  32. if(s[3]!=s[1]) return false;
  33. if(s[4]!=s[1]) return false;
  34. if(s[5]!=s[0]) return false;
  35. if(s[6]!=s[1]) return false;
  36. if(s[7]!=s[0]) return false;
  37. return true;
  38. }
  39. bool year(int n){
  40. int mday=n%100;
  41. int mmon=(n%10000-mday)/100;
  42. int myea=(n-n%10000)/10000;
  43. if((myea%4==0&&myea%100!=0)||(myea%400==0)) mon[2]++;
  44. if(mmon>12) return false;
  45. if(mday>mon[mmon]) return false;
  46. return true;
  47. }
  48. int main(){
  49. cin>>data;
  50. int temp;
  51. for(int i=data+1;;i++){
  52. if(fun(i)){
  53. if(year(i)){
  54. cout<<i<<endl;
  55. temp=i;
  56. break;
  57. }
  58. }
  59. }
  60. for(int i=temp;;i++){
  61. if(sfun(i)){
  62. if(year(i)){
  63. cout<<i<<endl;
  64. break;
  65. }
  66. }
  67. }
  68. return 0;
  69. }

七、字串排序

 思路:1、逆序数等于冒泡排序冒泡交换的次数

 

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 1e4 + 10;
  4. char ans[N], res[N];
  5. int n, len;
  6. bool judge()
  7. {
  8. int i = len;
  9. while(ans[i] == res[i] && i) i--;
  10. return res[i] < ans[i];
  11. }
  12. void dfs(int now, int maxn, int m, int sum) {
  13. if(sum == n)
  14. {
  15. if(m < len || (m == len && judge()))
  16. {
  17. len = m;
  18. for(int i = 1; i <= len; i++) ans[i] = res[i];
  19. }
  20. return;
  21. }
  22. if(now >= 26) return ;
  23. for(int i = 1; i <= maxn; i++)
  24. {
  25. int temp = sum + m * i;
  26. if(temp > n) return ;
  27. res[m + i] = char(now + 'a');
  28. dfs(now + 1, i, m + i, temp);
  29. }
  30. }
  31. int main()
  32. {
  33. len = 0x3f3f3f3f;
  34. scanf("%d", &n);
  35. dfs(0, 8, 0, 0);
  36. for(int i = len; i >= 1; i--)
  37. putchar(ans[i]);
  38. return 0;
  39. }

八、成绩统计

 

思路:先就是对这个数+0.5然后强制成Int就成了,但是也要注意四舍五入的情况。

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. double a = 0;
  6. double b = 0;
  7. double c;
  8. cin >> c;
  9. int n;
  10. for (int i = 0; i < c; i++)
  11. {
  12. cin >> n;
  13. if (n >= 60)
  14. {
  15. a++;
  16. }
  17. if (n >= 85)
  18. {
  19. b++;
  20. }
  21. }
  22. int x =(a * 100.0)/c+0.5;
  23. int y =(b * 100.0)/c+0.5;
  24. cout << x << "%" << endl << y << "%";
  25. return 0;
  26. }

 九、字串分值和

 思路:采用的是贡献值方法

  1. #include <iostream>
  2. using namespace std;
  3. int last[30];
  4. long long ans = 0;
  5. int main() {
  6. string s;
  7. cin >> s;
  8. int len = s.length();
  9. s = '0' + s;
  10. for (int i = 1; i <= len; i++) {
  11. ans += (long long)(len - i + 1) * (i - last[s[i]-'a']);
  12. last[s[i]-'a'] = i;
  13. }
  14. cout << ans;
  15. return 0;
  16. }

十、平面切分

 

思路:下面的直线都优先进行去重,然后进行接下来操作
1.如果新增的直线和一个直线平行,那么就+1
2.如果新增的直线与平面内所有的直线有交点,且这个交点和之前的交点不一样(交点用set去重)那么增加的分割数就是交点数+1。 

 

  1. #include <iostream>
  2. #include <set>
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5. int n;
  6. double A[1005],B[1005];
  7. int main(){
  8. cin>>n;
  9. set<pair<double,double> >a;
  10. while(n--){
  11. double x;
  12. double y;
  13. cin>>x>>y;
  14. a.insert(pair<double,double>(x,y));
  15. }
  16. set<pair<double,double> >:: iterator it=a.begin();
  17. for(int i=0;i<a.size();i++){
  18. A[i]=it->first;
  19. B[i]=it->second;
  20. it++;
  21. }
  22. long long ans = 2;
  23. for(int i = 1; i < a.size(); i++)
  24. {
  25. set<pair< double, double> > pos;
  26. for(int j = 0; j <= i-1; j++)
  27. {
  28. double a1 = A[i], b1 = B[i];
  29. double a2 = A[j], b2 = B[j];
  30. if(a1 == a2) continue;
  31. double x= (b2-b1)/(a1-a2);
  32. double y= a1*(b2-b1)/(a1-a2) + b1;
  33. pos.insert(pair<double,double>(x,y));
  34. }
  35. ans += pos.size() + 1;
  36. }
  37. cout<<ans<<endl;
  38. return 0;
  39. }

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

闽ICP备14008679号