ZISUOJ 2024算法基础公选课练习一(2)

news/2024/11/8 15:08:57 标签: 算法

前言、

接(1)后完成F-H三道题

一、题目总览

二、具体题目

2.1 问题 F: 按1的个数排序:

思路:

用cin或者getline读入都可,可以整合成一个结构体放进数组中排序,也可以像我下面一样写一个pair放进vector中排序,因为pair的排序规则是先按第一个参数升序排序,再按第二个参数升序排序的,所以我们将第一个参数设置为1的个数(int),第二个参数则是字符串本身(string),这样就无须写cmp()函数或者结构体内重载小于号,最后输出即可

参考代码:

#include <bits/stdc++.h>
using i64 = long long;
using pis = std::pair<int,std::string>;

int main(){
    std::cin.tie(nullptr)->sync_with_stdio(false);

    std::vector<pis> v;
    std::string str;
    while(std::getline(std::cin,str)) {
        v.emplace_back(std::count(str.begin(),str.end(),'1'),str);
    }

    std::sort(v.begin(),v.end());
    for(auto &vi:v) {
        std::cout << vi.second << '\n';
    }

    return 0;
}

2.2 问题 G: 排名次:

思路:

也是很经典的排序题,思路基本差不多,读入数组,然后排序,既可以以结构体的形式放入数组,然后重载小于号方便直接sort()或者写一个cmp()函数。也可以使用模板去重载pair的小于号,因为pair的排序是先按first升序排序的,我们这里的分数需要降序排序,因此需要重载小于号,当然用匿名函数也可以实现cmp()函数比较pair

参考代码1(结构体+重载小于号实现sort):

#include <bits/stdc++.h>
using i64 = long long;
struct stu {
    std::string _name;
    int _score;
    stu(std::string name,int score):_name(name),_score(score){}
    bool operator < (const stu& W) const {
        if(_score!=W._score) return _score>W._score;
        return _name<W._name;
    }
};

int main(){
    std::cin.tie(nullptr)->sync_with_stdio(false);

    int n;std::cin >> n;
    std::vector<stu> v;
    std::string name;
    int score;
    for(int i = 0;i<n;i++) {
        std::cin >> name >> score;
        v.emplace_back(name,score);
    }
    
    std::sort(v.begin(),v.end());
    for(auto &vi:v) {
        std::cout << vi._name << ' ' << vi._score << '\n';
    }

    return 0;
}

参考代码2(结构体+cmp函数实现sort):

#include <bits/stdc++.h>
using i64 = long long;
struct stu {
    std::string _name;
    int _score;
    stu(std::string name,int score):_name(name),_score(score){}
};
bool cmp(const stu &stu1,const stu &stu2) {
    if(stu1._score!=stu2._score) return stu1._score>stu2._score;
    return stu1._name<stu2._name;
}

int main(){
    std::cin.tie(nullptr)->sync_with_stdio(false);

    int n;std::cin >> n;
    std::vector<stu> v;
    std::string name;
    int score;
    for(int i = 0;i<n;i++) {
        std::cin >> name >> score;
        v.emplace_back(name,score);
    }

    std::sort(v.begin(),v.end(),cmp);
    for(auto &vi:v) {
        std::cout << vi._name << ' ' << vi._score << '\n';
    }

    return 0;
}

参考代码3(重载pair的小于号不太方便,于是考虑创建模板实现pair比较的结构体,重载()后sort时调用):

#include <bits/stdc++.h>
using i64 = long long;
using pis = std::pair<int,std::string>;

template<typename T1,typename T2>
struct PairCmp {
    bool operator()(const std::pair<T1,T2> &p1,const std::pair<T1,T2> &p2) const{
        if(p1.first!=p2.first) return p1.first>p2.first;
        return p1.second<p2.second;
    }
};

using PisCmp = PairCmp<int,std::string>;

int main(){
    std::cin.tie(nullptr)->sync_with_stdio(false);

    int n;std::cin >> n;
    std::vector<pis> v;
    std::string name;
    int score;

    for(int i = 0;i<n;i++) {
        std::cin >> name >> score;
        v.emplace_back(score,name);
    }

    std::sort(v.begin(),v.end(),PisCmp());
    for(auto &vi:v) {
        std::cout << vi.second << ' ' << vi.first << '\n';
    }

    return 0;
}

参考代码4(匿名函数实现std::pair<int,std::string>进行sort):

#include <bits/stdc++.h>
using i64 = long long;
using pis = std::pair<int,std::string>;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    int n;std::cin >> n;
    std::vector<pis> v;
    std::string name;
    int score;
    
    for(int i = 0;i<n;i++) {
        std::cin >> name >> score;
        v.emplace_back(score,name);
    }
    
    auto cmp = [&](const pis& stu1,const pis& stu2) ->bool {
        if(stu1.first!=stu2.first) return stu1.first>stu2.first;
        return stu1.second<stu2.second;
    };
    std::sort(v.begin(),v.end(),cmp);

    for(auto &vi:v) {
        std::cout << vi.second << ' ' << vi.first << '\n';
    }

    return 0;
}

2.3 问题 H: 子字符串排序:

思路:

这是一个新题,应该是从codeforces上搬运过来的,因为放在string和sort的练习专题里,考虑贪心和排序,先按字符串的长度升序排序,然后根据字典序排序,排序好之后check一遍,是否前者是后者的子集,这里可以考虑用string的find函数

参考代码:

#include <bits/stdc++.h>
using i64 = long long;

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    int n;
    std::cin >> n;
    std::vector<std::string> v;
    std::string str;
    
    for(int i = 0;i<n;i++) {
        std::cin >> str;
        v.emplace_back(str);
    }
    
    std::sort(v.begin(),v.end(),[&](const std::string &s1,const std::string &s2)->bool {
        if(s1.size()!=s2.size()) return s1.size() < s2.size();
        return s1 < s2;
    });
    
    auto check = [&]()->bool {
        for(int i = 0;i<v.size()-1;i++) {
            if(v[i+1].find(v[i])==std::string::npos) return false;
        }
        return true;
    };
    
    if (check()) {
        std::cout << "YES\n";
        for(auto &vi:v) {
            std::cout << vi << '\n';
        }
    }else {
        std::cout << "NO\n";
    }
    
    return 0;
}

 


http://www.niftyadmin.cn/n/5744055.html

相关文章

革新汽车装配产线:MR30分布式IO模块引领智能制造新时代

在日新月异的汽车制造行业中&#xff0c;每一分每一秒的效率提升都意味着成本的降低与市场竞争力的增强。随着工业4.0时代的到来&#xff0c;智能化、自动化已成为汽车产线升级转型的关键词。在这场技术革命的浪潮中&#xff0c;MR30分布式IO模块以其高效、灵活、可靠的特点&am…

快速入门CSS

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗 如有错误&#xff0c;欢迎指出~ 目录 CSS css的三种引入方式 css书写规范 选择器分类 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 color颜色设置 border边框设置 width/heigth 内/外边距 C…

《深入浅出Apache Spark》系列③:Spark SQL解析层优化策略与案例解析

导读&#xff1a;本系列是Spark系列分享的第三期。第一期分享了Spark Core的一些基本原理和一些基本概念&#xff0c;包括一些核心组件。Spark的所有组件都围绕Spark Core来运转&#xff0c;其中最活跃的一个上层组件是Spark SQL。第二期分享则专门介绍了Spark SQL的基本架构和…

评论系统设计思路

文章目录 一 表设计Articles&#xff08;文章表&#xff09;Comments&#xff08;评论索引表&#xff09;CommentsContent&#xff08;评论内容表&#xff09;SQL 创建表的语句触发器 二 添加评论三 查询评论 无论我们是阅读公众号文章还是刷短视频&#xff0c;现在都有评论功能…

【Apache ECharts】<病虫害致粮食损失统计>

实现 1. 设置 div &#xff08;块级盒子&#xff09;,设置 id 为 chart <div id"chart"></div> 2. css设置样式位置 <style>#main{width: 30%;height: 40vh;/* background-color: red; */min-height: 100px;min-width: 150px;margin-top: 150px;}…

【算法与数据结构】【链表篇】【题1-题5】

题1.从尾到头打印链表 题目&#xff1a;输入一个链表的头结点&#xff0c;从尾到头反过来打印出每个节点的值。链表的定义如下&#xff1a; struct ListNode {int mValue;ListNode *mNext;ListNode *mPrev; }; 1.1 方法一&#xff1a;栈 思路&#xff1a;要反过来打印&…

聊一聊SpringBoot中的自定义Starter

前言 自己动手简单的封装、应用一个starter 该starter的作用是被引入后&#xff0c;会对项目中Controller出现的异常做统一的处理及反馈 starter的思想在实际开发过程被大量的应用 一、新建starter项目 使用IDE创建一个maven构建方式的空白项目 1.1pom.xml <?xml vers…

独立站 API 接口的性能优化策略

一、缓存策略* 数据缓存机制 内存缓存&#xff1a;利用内存缓存系统&#xff08;如 Redis 或 Memcached&#xff09;来存储频繁访问的数据。例如&#xff0c;对于商品信息 API&#xff0c;如果某些热门商品的详情&#xff08;如价格、库存、基本描述等&#xff09;被大量请求…