【算法笔记题解】《算法笔记知识点记录》第四章——算法初步1——排序(1)

简介: 【算法笔记题解】《算法笔记知识点记录》第四章——算法初步1——排序(1)

由于放原题的话文章实在太长,所以题多的话我只放思路和题解,大家请前往相应的网站查看题目呀0.0


🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人

✨联系方式:2201891280(QQ)

📔源码地址:https://gitee.com/xingleigao/algorithm-notes

⏳全文大约阅读时间: 30min


全文目录

🍕3.1小节——入门模拟->简单模拟

问题 A: 排序

问题 B: 特殊排序

问题 C: EXCEL排序

问题 D: 字符串内排序

问题 E: Problem B

问题 F: 小白鼠排队

问题 G: 中位数

问题 H: 整数奇偶排序

问题 I: 排名

A1062 Talent and Virtue (25 分)

A1012 The Best Rank (25 分)

A1025 PAT Ranking (25 分)

A 1028 List Sorting (25 分)

A 1055 The World's Richest (25 分)

A 1083 List Grades (25 分)

A 1080 Graduate Admission (30 分)

1095 Cars on Campus (30 分)

🍕3.1小节——入门模拟->简单模拟

地址合集:《算法笔记》4.1小节——算法初步->排序


问题 A: 排序

直接调用函数就好了


#include <cstdio>
#include <algorithm>
using namespace std;
int hash[101];
int main(){
    int n;
    while(scanf("%d",&n) != EOF){
        for(int i = 0;i < n;++i)  scanf("%d",&hash[i]);//读入数据
        sort(hash,hash + n);//排序
        for(int i = 0;i < n - 1;++i)    printf("%d ",hash[i]);//输出
        printf("%d\n",hash[n-1]);
    }
    return 0;
}


问题 B: 特殊排序

这个有个隐藏条件是最大值只有一个。。。


#include <cstdio>
#include <algorithm>
using namespace std;
int hash[1001];
int main(){
    int n;
    while(scanf("%d",&n) != EOF){
        for(int i = 0;i < n;++i)  scanf("%d",&hash[i]);//读入数据
        sort(hash,hash + n);//排序
        printf("%d\n",hash[n-1]);   //输出最大值
        for(int i = 0;i < n - 2;++i)    printf("%d ",hash[i]);//输出
        if(n == 1)     printf("-1\n");
        else    printf("%d\n",hash[n-2]);
    }
    return 0;
}


问题 C: EXCEL排序

条件排序就好了,利用全局变量通信就不用写多个cmp函数啦。


#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct STU{
    char id[7];
    char name[9];
    unsigned char score;
}stu[100000];
int c;
bool cmp(STU a, STU b){
    if(c == 2 && strcmp(a.name,b.name) != 0) return strcmp(a.name,b.name) < 0;
    else if(c == 3 && a.score != b.score)   return a.score < b.score;
    return strcmp(a.id, b.id) < 0;
}
int main(){
    int n, Case = 1;
    while(scanf("%d %d",&n, &c) != EOF && n != 0){
        for(int i = 0;i < n;++i)    scanf("%s %s %d", stu[i].id, stu[i].name, &stu[i].score);
        sort(stu, stu + n, cmp);
        printf("Case %d:\n",Case);
        Case++;
        for(int i = 0;i < n;++i)    printf("%s %s %d\n",stu[i].id, stu[i].name, stu[i].score);
    }
    return 0;
}


问题 D: 字符串内排序

读入之后直接进行排序就好了。


#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
  char a[210];
  while(cin.getline(a,210)){
  sort(a,a+strlen(a));
  puts(a);  
  }
  return 0;
}

问题 E: Problem B

简单模拟求一下就好了

#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
    int m;
    while(scanf("%d",&m) != EOF){
        int a[m][m];
        for(int i = 0; i < m; ++i)
            for(int j = 0; j < m; ++j)
                scanf("%d",&a[i][j]);
        int b[2*m + 2];
        for(int i = 0; i < m; ++i){     //每行每列加和
            int numi = 0,numj = 0;
            for ( int j = 0; j < m; j++){
                numi += a[i][j];
                numj += a[j][i];
            }
            b[i] = numi;
            b[i+m] = numj;
        }
        int numi =0;
        int numj = 0;
        for(int i = 0; i < m; ++i){     //对角线加和
            numi += a[i][i];
            numj += a[i][m-i-1];
        }
        b[2*m] = numi;
        b[2*m+1] = numj;
        sort(b,b + 2*m + 2);
        for(int i = 2*m + 1; i >= 0; --i) printf("%d ",b[i]);
        puts("");
    }
    return 0;
}


问题 F: 小白鼠排队

按要求排输出就好了。


#include<cstdio>
#include<algorithm>
using namespace std;
struct xiaobaishu{
    int weight;
    char color[11];
}shu[101];
bool cmp(xiaobaishu a, xiaobaishu b){
    return a.weight > b.weight;
}
int main(){
    int n;
    while( scanf ("%d", &n) != EOF){
        for(int i = 0; i < n; ++i)  scanf("%d %s",&shu[i].weight,shu[i].color);
        sort(shu, shu + n, cmp);
        for(int i = 0; i < n;++i)   printf("%s\n",shu[i].color);
    }
    return 0;
}


问题 G: 中位数

按照要求求就行了,需要注意如果数字数量为偶数的话是中间两个的平均数!


#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
    int n;
    while(scanf("%d" ,&n) != EOF&&n != 0){
        int a[n];
        for(int i = 0; i < n; ++i)  scanf("%d", &a[i]);
        sort(a,a +n);
        if(n % 2 == 1)
            printf("%d\n",a[n/2]);
        else
            printf("%d\n",(a[n/2-1]+a[n/2])/2);
    }
    return 0;
}


问题 H: 整数奇偶排序

按照写就好了,可以利用异或的特性简化if的书写。值得学习呀,我也是偷师偷来的。


#include<cstdio>
#include<algorithm>
using namespace std;
bool cmp(int a, int b){
    if((a % 2) ^ (b % 2)) return a % 2 == 1;    //同0异1 所以这里就是不一样的情况 奇数在前 所以这么写
    else if(a % 2 == 1 ) return a > b;
    else return a < b;
}
int main(){
    int a[10];
    while(scanf("%d %d %d %d %d %d %d %d %d %d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7],&a[8],&a[9]) != EOF){
        sort(a , a + 10, cmp);
        for(int i = 0; i< 10; ++i)  printf("%d ",a[i]);
        puts("");
    }
    return 0;
}


问题 I: 排名

按照要求选就好了呀。


#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct student{
    char id[21];
    int score;
}stu[10001];
bool cmp(student a, student b){
    if(a.score != b.score) return a.score > b.score;
    else return strcmp(a.id, b.id) < 0;
}
int main(){
    int n, m, g;
    while(scanf("%d",&n) && n!= 0){
        scanf("%d %d", &m , &g);
        int s[m],num = 0;
        for(int i = 0; i < m; ++i)  scanf("%d",&s[i]);
        for(int i = 0; i < n; ++i){
            scanf("%s",stu[i].id);
            stu[i].score = 0;
            int ms,mn;
            scanf("%d",&ms);
            for( int j = 0; j < ms; ++j){
                scanf("%d",&mn);
                stu[i].score += s[mn-1];
            }
            if(stu[i].score >= g)   num++;
        }
        sort(stu, stu + n, cmp);
        printf("%d\n",num);
        for(int i = 0;i < n; ++i)   printf("%s %d\n",stu[i].id,stu[i].score);
    }
    return 0;
}


A1062 Talent and Virtue (25 分)

地址:A1062 Talent and Virtue (25 分)|B1015 德才论 (25 分)


#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct student{
  char id[10];
  int D, C, sum, flag;
}stu[100010];
bool cmp(student a, student b){
  if(a.flag != b.flag)  return a.flag < b.flag;
  else if(a.sum != b.sum) return a.sum > b.sum;
  else if(a.D != b.D) return a.D > b.D;
  else    return strcmp(a.id, b.id) < 0;
}
int main(int argc, char *argv[]){
  int n, L, H;
  while(scanf("%d%d%d", &n, &L, &H) != EOF){
  int m = n;
  for(int i = 0; i < n; ++i){
    scanf("%s%d%d",stu[i].id, &stu[i].D, &stu[i].C);
    stu[i].sum = stu[i].D + stu[i].C;
    if(stu[i].D < L || stu[i].C < L){
    m--;
    stu[i].flag = 5;
    }
    else if(stu[i].D >= H && stu[i].C >= H) stu[i].flag = 1;
    else if(stu[i].D >= H ) stu[i].flag = 2;
    else if(stu[i].D >= stu[i].C)  stu[i].flag = 3;
    else      stu[i].flag = 4;  
  }
  sort(stu, stu + n, cmp);
  printf("%d\n", m);
  for(int i = 0; i< m; i++) printf("%s %d %d\n",stu[i].id, stu[i].D, stu[i].C);   
  }
  return 0;
}



相关文章
|
10天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
51 8
|
10天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
40 7
|
1月前
|
算法 API 计算机视觉
人脸识别笔记(一):通过yuface调包(参数量54K更快更小更准的算法) 来实现人脸识别
本文介绍了YuNet系列人脸检测算法的优化和使用,包括YuNet-s和YuNet-n,以及通过yuface库和onnx在不同场景下实现人脸检测的方法。
33 1
|
1月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
59 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
1月前
|
存储 算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
这篇文章是关于动态规划算法中矩阵连乘问题的详解,包括问题描述、最优子结构、重叠子问题、递归方法、备忘录方法和动态规划算法设计的步骤。
101 0
|
1月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
13 0
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
31 0
|
25天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
10天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
11天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。