【CSDN竞赛第6期】编程竞赛总结

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

前言/背景

目前已经连续参加5次CSDN的编程竞赛了,这种比赛挺有意义的,希望一直举办下去!

题目与解题代码

本次题目有四个,相对往期,这期的题目比较简单,所以一堆人拿到了满分(包括我)。所有题目直接暴力都可以解出来,这边贴出我当时的解题代码。

在这里插入图片描述

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
int solution(int n, std::vector<std::string>& vec){
    
    
    int result=0;
// TODO:
    for(int i=0;i<n;i++){
    
    
        if(vec[i].size()>=2&&vec[i].size()<=4){
    
    
            if(vec[i]=="ak")result++;
            else if(vec[i]=="m4a1")result++;
            else if(vec[i]=="skr")result++;
            else continue;
        }
    }return result;
}
int main() {
    
    
    int n;
    std::vector<std::string> vec;
    std::cin>>n;
    for (size_t i = 0; i < n; i++){
    
    
        std::string s;
        std::cin>>s;
        vec.push_back(s);
    }
    int result = solution(n,vec);
    std::cout<<result<<std::endl;
    return 0;
}

在这里插入图片描述直接使用一个map来存储数量,然后选出数量最大的就行。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include<map>
std::string solution(int n, std::vector<std::string>& vec){
    
    
    std::string result;
// TODO:
    std::map<std::string,int>mp;
    for(size_t i=0;i<n;i++){
    
    
        mp[vec[i]]++;
    }int max_val = 0;
    for(size_t i=0;i<n;i++){
    
    
        if(mp[vec[i]]>max_val){
    
    
            max_val = mp[vec[i]];
            result=vec[i];
        }
    }
    return result;
}
int main() {
    
    
    int n;
    std::vector<std::string> vec;
    std::cin>>n;
    for (size_t i = 0; i < n; i++){
    
    
        std::string s;
        std::cin>>s;
        vec.push_back(s);
    }
    std::string result = solution(n,vec);
    std::cout<<result<<std::endl;
    return 0;
}

在这里插入图片描述

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
std::string solution(std::string str){
    
    
    std::string result="";
    // TODO:
    int flag=0;
    for(size_t i=0;i<str.size();i++){
    
    
    if(!flag&&i>0&&i<str.size()-2&&str[i]=='a'&&str[i+1]=='t'){
    
    
    result += '@';
    flag=1;
    i+=1;
    }else if(i>0&&i<str.size()-3&&str[i]=='d'&&str[i+1]=='o'&&str[i+2]=='t'){
    
    
    result+='.';
    i+=2;
    }else{
    
    
    result+=str[i];
    }
    }
    return result;
}
int main() {
    
    
    std::string str;
    std::cin>>str;
    std::string result = solution(str);
    std::cout<<result<<std::endl;
    return 0;
}

在这里插入图片描述
这题求的是最长递增子数组的长度,所以直接双指针解决就行了,如果是求解最长递增子序列的长度的话可以使用动态规划。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
int solution(int n, std::vector<int>& vec){
    
    
// TODO:
    if(n<=1)return n;
    int result = 1;
    int start = 0;
    int end = 1;
    for(int i=1;i<n;i++){
    
    
        if(vec[i]>vec[i-1]){
    
    
            end++;
        }else{
    
    
            start=i;
            end=i+1;
        }
        result = result>end-start?result:end-start;
    }
    return result;
}
int main() {
    
    
    int n;
    std::cin>>n;
    std::vector<int> vec(n);
    for(int i=0;i<n;i++){
    
    
        std::cin>>vec[i];
    }
    int result = solution(n,vec);
    std::cout<<result<<std::endl;
    return 0;
}

经验心得

这次由于题目比较简单,所以题目本身其实不太有参考价值。不过做题角度来看的话,我觉得像CSDN这种核心代码模式的做题方式,首先需要搞清楚系统给定的输入输出,有时候还需要质疑系统给定的输入输出是否有问题,有问题的话可以重新按照题意直接自己写输入输出。

建议

对于CSDN的竞赛系统,结合往期参加的感受来说,主要觉得有以下几点是可以改进的:

  1. 页面内自己代码之间的复制粘贴依旧会记录次数,这个体验不太好;
  2. 编译出错误后错误描述可以再清楚些,尽量像力扣那样易懂;
  3. 最后一点,也是每期都有人吐槽的一点,就是防作弊机制,每次看到排名前几的大神几分钟就完事,都不免让人觉得是不是有什么猫腻(当然不否认真的有这种超厉害的大神)。后期再举办的话感觉可以把限时进入时间缩短,例如10点半开考,那么开考15分钟后就进不了系统,类似这样的机制。
  4. 还有一点,电子书月卡奖励麻烦下次换过一种奖励吧,这个实在过于鸡肋。。。

猜你喜欢

转载自blog.csdn.net/weixin_42301220/article/details/127031917