当前位置:   article > 正文

CSDN编程竞赛第六期_csdn编程竞赛界面

csdn编程竞赛界面

CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16

本次是我第二次参加CSDN举办的编程竞赛,这一次的题相比上一次简单不少,对编程新人或者刚开始学习算法的人很友好。

前言/背景

本次CSDN编程竞赛第六期是4个编程题

大赛简介

参赛时间:9月18日8:30-11:00

时长:2小时(只要在规定参赛时间内进入比赛,都能获得2小时的答题时间,即使总时间超过了11:00)

参赛流程

首先就是在赛前进行一个报名,主要包含自己的一些基本信息,到比赛的日期时,进入比赛首页,点击进入比赛,输入姓名和电话,就能进入系统答题,当点击结束答题或者时长超过两个小时就会终止答题,并将当前成绩算为最终成绩不可修改。

参赛经历

比赛前,预先在各大刷题平台上刷了一些基础的题,熟悉一些编程算法,以免在比赛的时候手足无措;临近比赛,将电脑打开比赛页面,随时等待进入系统,并且最好选择一个较为安静的地方,有利于自己对问题的思考;正式比赛的时候,就按照题目顺序做的题。本次也是拿到了满分,很高兴。

解题思路

第一题:X国最近开始严管枪火。 像是“ak”,“m4a1”,“skr”。都是明令禁止的。 现在小Q查获了一批违禁物品其中部分是枪支。 小Q想知道自己需要按照私藏枪火来关押多少人。 (只有以上三种枪被视为违法)

根据题目意思得到就是查出[“ak”,“m4a1”,“skr”]出现了多少次。

 这题其实很简单,直接使用for循环遍历,并利用C++的string直接进行“==”比较即可,相等就对答案进行加一

  1. #include <iostream>
  2. #include <string>
  3. #include <sstream>
  4. #include <vector>
  5. int main() {
  6. int n;
  7. std::vector<std::vector<std::string>> vec;
  8. std::cin>>n;
  9. std::string line, token;
  10. for (size_t i = 0; i < n; i++){
  11. std::vector<std::string> s;
  12. getline(std::cin >> std::ws,line);
  13. std::stringstream tokens(line);
  14. while(std::getline(tokens, token, ' ')){
  15. s.push_back((token));
  16. }
  17. vec.push_back(s);
  18. }
  19. int result = 0;
  20. for(int i = 0;i < n;i ++) {
  21. for(int j = 0;j < vec[i].size();j ++) {
  22. std::string str = vec[i][j];
  23. if(str == "ak" || str == "m4a1" || str == "skr") {
  24. result ++;
  25. }
  26. }
  27. }
  28. std::cout<<result<<std::endl;
  29. return 0;
  30. }

第二题:鬼画符门,每年都会统计自己宗门鬼画符消耗的数量,往年一直是大师兄管理, 但是这次鬼艺接手了, 你能帮鬼艺写一个 程序统计每年消耗数量最多的鬼画符吗?

根据题目意思可知,就是求得出现次数最多的字符串是哪一个

思路:直接暴力,使用map存储每一个字符串出现的次数,并使用一个变量存储出现的最大次数是多少,每次判断最大出现次数是否为当前字符串,并进行更新答案即可

 

  1. #include <iostream>
  2. #include <string>
  3. #include <sstream>
  4. #include <vector>
  5. #include <bits/stdc++.h>
  6. using namespace std;
  7. int main() {
  8. int n;
  9. std::vector<std::vector<std::string>> vec;
  10. std::cin>>n;
  11. std::string line, token;
  12. for (size_t i = 0; i < n; i++){
  13. std::vector<std::string> s;
  14. getline(std::cin >> std::ws,line);
  15. std::stringstream tokens(line);
  16. while(std::getline(tokens, token, ' ')){
  17. s.push_back((token));
  18. }
  19. vec.push_back(s);
  20. }
  21. std::string result;
  22. map<string, int> num;
  23. int count = 0;
  24. for(int i = 1;i < n;i ++) {
  25. for(int j = 0;j < vec[i].size();j ++) {
  26. string str = vec[i][j];
  27. num[str] ++;
  28. if(num[str] > count) {
  29. count = num[str];
  30. result = str;
  31. }
  32. }
  33. }
  34. std::cout<<result<<std::endl;
  35. return 0;
  36. }

第三题:已知字符串str,str表示邮箱的不标准格式。 其中”.”会被记录成”dot”,”@”记录成”at”。 写一个程序将str转化成可用 的邮箱格式。(可用格式中字符串中除了开头结尾所有”dot”,都会被转换,”at”只会被转化一次,开头结尾的不转化)

思路:直接暴力,for循环遍历字符串,每次从当前字符开始往后取三个字符,判断是否为dot,然后进行替换,取两个字符,判断是否为at,以及已经替换的at次数是否小于1,再进行替换即可

  1. #include <iostream>
  2. #include <string>
  3. #include <sstream>
  4. #include <vector>
  5. using namespace std;
  6. int main() {
  7. std::string str;
  8. std::cin>>str;
  9. std::string result = "";
  10. int number = 0;
  11. int len = str.size();
  12. for(int i = 0;i < len;i ++) {
  13. if(i + 2 < len - 1 && i > 0) {
  14. string temp = "";
  15. for(int j = 0;j < 3;j ++) {
  16. temp += str[i + j];
  17. }
  18. if(temp == "dot") {
  19. result += ".";
  20. i = i + 2;
  21. continue;
  22. }
  23. }
  24. if(i + 1 < len - 1 && i > 0) {
  25. string temp = "";
  26. for(int j = 0;j < 2;j ++) {
  27. temp += str[i + j];
  28. }
  29. if(temp == "at" && number == 0) {
  30. result += "@";
  31. i = i + 1;
  32. number ++;
  33. continue;
  34. }
  35. }
  36. result += str[i];
  37. }
  38. std::cout<<result<<std::endl;
  39. return 0;
  40. }

第四题:给一个无序数组,求最长递增的区间长度。如:[5,2,3,8,1,9] 最长区间 2,3,8 长度为 3

思路:直接暴力,每次判断当前元素vec[i]是否大于vec[i - 1],如果大于就对当前上升序列长度加一,每次更新最长递增的区间长度即可,如果遇到vec[i] <= vec[i - 1],就将当前上升序列长度置为1

  1. #include <iostream>
  2. #include <string>
  3. #include <sstream>
  4. #include <vector>
  5. #include<bits/stdc++.h>
  6. using namespace std;
  7. int main() {
  8. int n;
  9. std::vector<int> vec;
  10. std::cin>>n;
  11. std::string line_0, token_0;
  12. getline(std::cin >> std::ws,line_0);
  13. std::stringstream tokens_0(line_0);
  14. while(std::getline(tokens_0, token_0, ' ')){
  15. vec.push_back(std::stoi(token_0));
  16. }
  17. int result = 1;
  18. int count = 1;
  19. for(int i = 1;i < n;i ++) {
  20. if(vec[i] > vec[i - 1]) {
  21. count ++;
  22. result = max(result, count);
  23. }
  24. else count = 1;
  25. }
  26. std::cout<<result<<std::endl;
  27. return 0;
  28. }

经验心得

本次竞赛的总体难度偏低,适合刚学习算法的新人,上一次参加CSDN的编程竞赛,只拿到了82.5,算是弥补了我一个心愿吧

资料分享

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

闽ICP备14008679号