某csdn大佬推荐的新手刷题网站,快速入门!洛谷

新手入门刷题(专题二)排序


4.5

【深基9.例1】选举学生会

题目描述

学校正在选举学生会成员,有 n ( n ≤ 999 ) 名候选人,每名候选人编号分别从 1 到 n,现在收集到了 m (m ≤ 2000000 ) 张选票,每张选票都写了一个候选人编号。现在想把这些堆积如山的选票按照投票数字从小到大排序。

输入格式

输入 n和 m以及 m个选票上的数字。

输出格式

求出排序后的选票编号。

输入样例

5 10
2 5 2 2 5 2 2 2 1 2

输出样例

1 2 2 2 2 2 2 2 5 5

思路

上去就无脑冒泡,结果TLE感动了,本题正确思路是采用计数排序

代码

#include<iostream>
using namespace std;
int a[2000];
int main(){int n,m;cin>>n>>m;for(int i=0;i<m;i++){int t;cin>>t;a[t]++;}int flag=0;for(int i=1;i<=n;i++){for(int j=0;j<a[i];j++){if(flag++) cout<<' ';cout<<i;}}return 0;
}

【模板】快速排序

题目描述

思路

每次迭代确保k值左边 <= k ,k 值右边 >= k, 即,每轮下来,确定一个k值的位置,快排模板是一定要记住的!!

这里简单记录一下位运算,>> 代表 右移

比如 6 的二进制为 0110,将其右移一位,变成 0011,即 3,因此 >>1 可以理解为 /2

代码

#include<iostream>
using namespace std;
int a[100010];
void quick_sort(int q[], int l, int r)
{//如果数组<=一个数,无需排序if (l >= r) return;int i = l - 1, j = r + 1, x = q[l + r >> 1];while (i < j){do i ++ ; while (q[i] < x);do j -- ; while (q[j] > x);if (i < j) swap(q[i], q[j]);}quick_sort(q, l, j);quick_sort(q, j + 1, r);
}
int main(){int n;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i]);}quick_sort(a,0,n-1);for(int i=0;i<n;i++){if(i<n-1){printf("%d ",a[i]);}else{printf("%d",a[i]);}}return 0;
}

【深基9.例4】求第 k 小的数

题目描述

思路

无论是求第k小数还是第k大数,都是快排的延伸,我们知道快排一轮可以确定一个数的位置,进行迭代的过程,我们只需要知道第k小数在该数字的左边还是右边,然后迭代单边即可,记住快排模板,加以改进即可。

代码

#include <iostream>
using namespace std;
const int N = 5000010;
int q[N];
//该模板是从第1个数开始的
int quick_sort(int q[], int l, int r, int k)
{if (l >= r) return q[l];int i = l - 1, j = r + 1, x = q[l + r >> 1];while (i < j){do i ++ ; while (q[i] < x);do j -- ; while (q[j] > x);if (i < j) swap(q[i], q[j]);}if (j - l + 1 >= k) return quick_sort(q, l, j, k);else return quick_sort(q, j + 1, r, k - (j - l + 1));
}int main(){int n, k;scanf("%d%d", &n, &k);//题目要求从第0个数开始,因此k++k++;//如果求第k大数,只需赋值k为如下代码即可//k = n-k+1;for (int i = 0; i < n; i ++ ) scanf("%d", &q[i]);cout << quick_sort(q, 0, n - 1, k) << endl;return 0;
}

[NOIP2006 普及组] 明明的随机数

题目描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 N 个 1 到 1000 之间的随机整数 ( N ≤ 100 ),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

思路

本题分为两步,第一步去重复,第二步排序,去重在输入过程中,遍历数组判断该数字是否存在即可

代码

#include <iostream>
using namespace std;
const int N = 110;
int q[N];
//排序直接用快排模板
int quick_sort(int q[], int l, int r)
{if (l >= r) return q[l];int i = l - 1, j = r + 1, x = q[l + r >> 1];while (i < j){do i ++ ; while (q[i] < x);do j -- ; while (q[j] > x);if (i < j) swap(q[i], q[j]);}quick_sort(q, l, j);quick_sort(q, j + 1, r);
}
int main(){int n;int len=1;scanf("%d", &n);for (int i = 0; i < n; i ++ ){int t;scanf("%d", &t);for(int j=0;j<len;j++){//如果输入的数字在数组中已存在,跳出本次循环if(q[j]==t) break;//否则在数组尾部插入该数字,并调整数组长度+1,确保数组尾部总有一个值为0的数字等待插入else if(q[j]==0){q[j]=t;len++;break;}}} quick_sort(q, 0, len-2);//数组实际长度为len-1,在数字插入操作时,为了确保数组尾部总有一个值为0的数字,数组长度故意+1printf("%d\n", len-1);for (int i = 0; i < len-1; i ++ ){if(i<len-2) printf("%d ", q[i]);else printf("%d", q[i]);} return 0;
}

4.8

[NOIP2007 普及组] 奖学金

题目描述

某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。

输入样例

6          //6组
90 67 80   //语数英成绩
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98

输出样例

6 265      //学号 总分
4 264
3 258
2 244
1 237

思路

本题与 帮贡排序 相似,在做帮贡排序时,我用两个数组做的,比较繁琐,本题采用结构体做法。首先题目要求:先按总成绩排序、再按语文成绩排序、再按学号排序。帮贡题是,先按帮贡排序,再按等级、再按经验,所以两道题很相似。本题中使用了sort大法 + 自定义比较函数,真香,具体步骤见代码。自定义比较函数,这里提供了两种方案,if else 和 三目表达式。

代码

#include <iostream>
#include<algorithm>
using namespace std;
struct Students{//学号int num;//语数英int c,m,e;//总分int sum;
};
Students s[310];
//比较函数
bool swp(Students s1,Students s2){//if else写法//总成绩if(s1.sum>s2.sum) return true;//语文成绩else if(s1.sum==s2.sum&&s1.c>s2.c) return true;//学号else if(s1.sum==s2.sum&&s1.c==s2.c&&s1.num<s2.num) return true;else return false;//三目表达式写法//return s1.sum>s2.sum?s1.sum>s2.sum:(s1.sum==s2.sum&&s1.c>s2.c?s1.c>s2.c:(s1.sum==s2.sum&&s1.c==s2.c&&s1.num<s2.num?s1.num<s2.num:0));//return 0;
}
int main(){int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d%d",&s[i].c,&s[i].m,&s[i].e);s[i].num = i;s[i].sum = s[i].c + s[i].m + s[i].e;}sort(s+1,s+1+n,swp);for(int i=1;i<=5;i++){printf("%d %d\n",s[i].num,s[i].sum);}return 0;
}

新手入门刷题(专题二)排序 (第一部分)相关推荐

  1. 新手入门刷题(专题三)暴力枚举

    新手入门刷题(专题三)暴力枚举--->持续更新 4.14 统计方形(数据加强版) 题目描述 有一个 n×m 方格的棋盘,求其方格包含多少正方形.长方形(不包含正方形). 输入格式 一行,两个正整 ...

  2. 在线答题考试小程序源码系统 支持在线刷题+考试二合一+安装部署教程

    分享一个在线答题考试小程序源码系统,支持在线刷题+考试二合一,程序包含前后端和详细的安装部署教程,可以用来给学生刷题,给员工刷题,给政企员工刷题,万能通用版适合任何行业在线刷题及考试. 系统功能一览: ...

  3. 力扣刷题——单链表系列——第一题:移除链表元素,从此链表初窥门径,神挡杀神~

    题目链接:力扣 力扣刷题------>单链表系列 第一种解法:在原链表上进行操作,小红日烧脑版 /*** Definition for singly-linked list.* public c ...

  4. 算法入门刷题笔记 Day10 - A - 拓扑排序·一 -- D - K-th Path

    写在前面 好久没更新公众号和博客了,因为最近在研究新的方向,所以很少发文. 笔者接触编程只有一年,这一年间主要研究启发式算法在运筹学中的应用.但是由于编程基础薄弱,在进一步研究复杂运筹学问题时发现基础 ...

  5. 力扣(LeetCode)怎么刷题,以排序算法为例

    掌握 LeetCode 刷题方法再开始刷题,属于磨刀不误砍柴工.掌握正确方法是非常重要的. 如果你在刷题的时候发现怎么也写不出来,别担心,这是正常的.如果你还发现,之前明明刷过的题,过段时间再做的时候 ...

  6. 每日刷题记录 (二十)

    文章目录 第一题: 16. 最接近的三数之和 解题思路: 代码实现: 第二题: 43. 字符串相乘 解题思路: 代码实现: 第三题: 59. 螺旋矩阵 II 解题思路: 代码实现: 第四题: 89. ...

  7. 算法入门刷题笔记 Day2 K - Coat of Anticubism L - Five-In-a-Row M - Island Puzzl......

    写在前面 好久没更新公众号和博客了,因为最近在研究新的方向,所以很少发文. 笔者接触编程只有一年,这一年间主要研究启发式算法在运筹学中的应用.但是由于编程基础薄弱,在进一步研究复杂运筹学问题时发现基础 ...

  8. 算法刷题重温(九): 排序算法来啦

    1. 写在前面 这篇文章复习排序算法, 排序算法的重要性也是不言而喻, 并且面试的时候经常会问到第K大,第K小,前K大,前K小的问题, 这往往都是排序算法的解决范畴. 在实际问题中,排序算法也是应用非 ...

  9. C语言计算机二级/C语言期末考试 刷题(二)

    收集了一些经典C语言计算机二级和C语言期末考试题库 整理不易,大家点赞收藏支持一下 祝大家计算机二级和期末考试都高分过 系列文章: C语言计算机二级/C语言期末考试 刷题(一) 目录 一.填空   共 ...

  10. 【系统集成项目管理刷题专题】第12章—项目沟通管理和干系人管理

    此专题记录从3月25日开始备考软考中级的全过程,2021年上半年第一次参与裸考两门都只考了35分.这次必须给过了,此系列文章为证. 注:文章内容为科科过章节刷题笔记 第一遍刷题笔记,第二遍框架逻辑 第 ...

最新文章

  1. 【经验】对一个合格C++高级工程师(音视频方向)的要求
  2. Matlab与数据结构 -- 对矩阵的排序
  3. OpenCV新手入门,如何用它平移缩放和旋转图片
  4. 这个操作稳!云厂商开设免费云计算课程,学员独享49元主机套餐包年!
  5. 关于现在手上做的项目的数据库设计思考
  6. ASP.NET站点性能提升-压缩
  7. layui 如何去dom_layui 的基本使用介绍
  8. 在windows和linux下如何查看80端口占用情况?是被哪个进程占用?如何终止等
  9. WebRTC Linux ADM 实现中的符号延迟加载机制
  10. vlc源码分析(五) 流媒体的音视频同步
  11. jquery入门与实践案例教程
  12. python json模块 超级详解
  13. 天池 在线编程 所有子数组之和(排列组合)
  14. SQL Server中的基数估计角色
  15. 问题九:C++中::是干嘛用的(域解析操作符)
  16. 解读《美国国家BIM标准》 – BIM能力成熟度模型(四)
  17. 网页版迅雷离线下载过程分析
  18. 009 [转载]天才与鬼才:黑客精英-凯文·米特尼克
  19. D盘目录或文件被损坏且无法读取怎么办
  20. Android OS历史版本

热门文章

  1. 在苹果Mac上怎样更改AirDrop名称?
  2. Tomcat下发布war包产生两个不同版本的访问地址的解决方案appBase和docBase的关系
  3. 关于MySQL8的URL和Driver的写法
  4. php 判断时间是星期几,通过PHP的date()函数判断今天是星期几
  5. 重置linux系统root密码,CentOS(Linux)重置root密码
  6. ImageNet数据集 下载
  7. 【Java小游戏】俄罗斯方块
  8. 我喜欢的作品风格: 韩国daksha作品IF YOU GO AWAY…
  9. 如何在scrapy框架里进行调试嘞
  10. 【源码】regtools:离散不适定问题的分析与求解