当前位置: 首页 > news >正文

题单【排序】

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

P1271 【深基9.例1】选举学生会 - 洛谷

【方法一】快速排序

使用sort(),注意数组的范围!!!

#include<bits/stdc++.h>
using namespace std;int a[2000000],n,m;int main()
{cin>>n>>m;for(int i=0;i<m;i++){cin>>a[i];}sort(a,a+m);for(int i=0;i<m;i++){cout<<a[i]<<" ";}return 0;
}

【方法二】桶排序

桶排序(Bucket Sort)是一种基于分配策略的排序算法,其工作原理是将数组分到有限数量的桶子里,然后对每个桶内的元素进行排序(可能再使用其他排序算法或是以递归方式继续使用桶排序),最后合并所有已排序的桶,从而完成整个数据集的排序。

#include<bits/stdc++.h>
using namespace std;int main()
{int n,m,p;cin>>n>>m;int a[1000]={0};        // 以候选人作为“桶”for(int i=0;i<m;i++){cin>>p;a[p]++;}for(int i=1;i<=n;i++){for(int j=0;j<a[i];j++){cout<<i<<' ';}}return 0;
}

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

P1923 【深基9.例4】求第 k 小的数 - 洛谷

【方法一】快速排序,直接输出

但是无法通过所有的测试点!!!

#include<bits/stdc++.h>
using namespace std;int main()
{int n,k;cin>>n>>k;int a[5000001]={0};for(int i=0;i<n;i++){cin>>a[i];}sort(a,a+n);cout<<a[k];return 0;
}

【方法二】根据快排的思想进行二分

在原二分的基础上可以进行修改:因为每次递归都会将数组划分为三部分,而答案只会在这三部分中的一个,不需要再对其他部分进行搜索,从而达到优化时间复杂度的效果。

#include<bits/stdc++.h>
using namespace std;int x[5000005],k;void qsort(int l,int r)
{int i=l,j=r,mid=x[(l+r)/2];do{while(x[j]>mid){j--;}while(x[i]<mid){i++;}if(i<=j){swap(x[i],x[j]);i++;j--;}}while(i<=j);//快排后数组被划分为三块: l<=j<=i<=rif(k<=j){qsort(l,j);			//在左区间只需要搜左区间}else if(i<=k){qsort(i,r);			//在右区间只需要搜右区间}else 					//如果在中间区间直接输出{printf("%d",x[j+1]);exit(0);}
}int main()
{int n;scanf("%d%d",&n,&k);for(int i=0;i<n;i++){scanf("%d",&x[i]);}qsort(0,n-1);
}

【方法三】利用 nth_element

在 STL 里有 nth_element 函数。它的用法是 nth_element(a+x,a+x+y,a+x+len)。

执行之后数组 a 下标 x 到 x+y−1 的元素都小于 a[x+y],下标 x+y+1 到 x+len−1 的元素 都大于 a[x+y],但不保证数组有序。此时 a[x+y] 就是数组区间 x 到 x+len−1 中第 y 小的数,当然也可以自己定义 cmp 函数。

#include<bits/stdc++.h>
using namespace std;int x[5000005],k;int main()
{int n;scanf("%d%d",&n,&k);for(int i=0;i<n;i++){scanf("%d",&x[i]);}nth_element(x,x+k,x+n);printf("%d",x[k]);
}

P1781 宇宙总统

P1781 宇宙总统 - 洛谷

#include<bits/stdc++.h>
using namespace std;int main()
{int n;cin>>n;int num;string a[21];string max;cin>>max;for(int i=1;i<n;i++){cin>>a[i];if((a[i].length()>max.length()) || (a[i].length()==max.length() && a[i]>max)){max=a[i];num=i+1;}}cout<<num<<endl;cout<<max<<endl;return 0;
}

P2676 [USACO07DEC] Bookshelf B

P2676 [USACO07DEC] Bookshelf B - 洛谷

贪心算法

先选最大的数(即最高的奶牛),一定能使取的数的数目(即奶牛数)最小

#include<bits/stdc++.h>
using namespace std;int main()
{long S[200005];long N,B,sum=0;cin>>N>>B;int num=0;for(int i=0;i<N;i++){cin>>S[i];}sort(S,S+N);for(int i=N-1;i>=0;i--){sum+=S[i];num++;if(sum>=B){break;}}cout<<num;return 0;
}

P1116 车厢重组

P1116 车厢重组 - 洛谷

计算每个数字后面有几个数字比它小,再相加,就可以计算出需要的最少次数。

相对于冒泡排序

#include<bits/stdc++.h>
using namespace std;int main()
{int n;int a[10010];cin>>n;for(int i=0;i<n;i++){cin>>a[i];}int num=0;for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){if(a[i]>a[j]){num++;}}}cout<<num;return 0;
}

P1068 [NOIP 2009 普及组] 分数线划定

P1068 [NOIP 2009 普及组] 分数线划定 - 洛谷

#include<bits/stdc++.h>
using namespace std;struct people
{int k;int s;
}per[5001];bool cmp(people a,people b)
{if(a.s!=b.s){return a.s>b.s;}else{return a.k<b.k;}
}int main()
{int n,m;cin>>n>>m;for(int i=0;i<n;i++){cin>>per[i].k>>per[i].s;}int num=m*1.5;sort(per,per+n,cmp);for(int i=num;i<n;i++){if(per[i].s==per[num-1].s){num++;}else{break;}}cout<<per[num-1].s<<" "<<num<<endl;for(int i=0;i<num;i++){cout<<per[i].k<<" "<<per[i].s<<endl;}return 0;
}

P5143 攀爬者

P5143 攀爬者 - 洛谷

#include<bits/stdc++.h>
using namespace std;struct zuobiao
{double x;double y;double z;
}dot[50001];bool cmp(zuobiao a,zuobiao b)
{return a.z<b.z;
}double solve(double x1,double x2,double y1,double y2,double z1,double z2)
{double x=pow(abs(x1-x2),2);double y=pow(abs(y1-y2),2);double z=pow(abs(z1-z2),2);double sum=pow(x+y+z,0.5);return sum;
}int main()
{int n;cin>>n;for(int i=0;i<n;i++){cin>>dot[i].x>>dot[i].y>>dot[i].z;}sort(dot,dot+n,cmp);double ans=0.0;int tag=0;for(int i=1;i<n;i++){if(dot[i].z>dot[tag].z){ans+=solve(dot[tag].x,dot[i].x,dot[tag].y,dot[i].y,dot[tag].z,dot[i].z);tag=i;}else{continue;}}cout<<fixed<<setprecision(3)<<ans;return 0;
}

P1012 [NOIP 1998 提高组] 拼数

P1012 [NOIP 1998 提高组] 拼数 - 洛谷

to_string------>可以实现数字向字符串转换(虽然这题没用到)

两个字符串 a,b,如果 a+b>b+a 则 a 排在前面。 这个公式的具体意思是当 a 排在 b 前面比 b 排在 a 前面要好,因为字典序更高,所以 a 自然要排在 b 的前面。

#include<bits/stdc++.h>
using namespace std;string a[25];bool cmp(string a,string b)
{return a+b>b+a;
}int main()
{int n,m;cin>>n;for(int i=0;i<n;i++){cin>>a[i];}sort(a,a+n,cmp);for(int i=0;i<n;i++){cout<<a[i];}return 0;
}
http://www.dtcms.com/a/314483.html

相关文章:

  • linux中 多进程 导致cuda错误的问题解决
  • 【测试】⾃动化测试常⽤函数
  • 配置Mybatis环境
  • 向量魔法:Embedding如何赋能大模型理解世界
  • 靶场(二十八)---小白心得靶场体会---Mantis
  • 嵌入式开发学习———Linux环境下IO进程线程学习(三)
  • DolphinScheduler 集成DataX
  • 前端VUE基础环境搭建
  • opencv引入libavif
  • typeof和instanceof区别
  • 静电干扰误报率↓85%!陌讯多模态融合算法在智慧环卫检测优化
  • python基础:数据解析BeatuifulSoup,不需要考虑前端形式的一种获取元素的方法
  • 【前端】JavaScript基础知识及基本应用
  • 【AMD】编译llama.cpp实践版
  • 管家级教程:在 Windows 上配置 WSL2、CUDA 及 VLLM,开源音频克隆项目
  • 解决 Alpine 容器中编译 confluent-kafka-go 报错的问题
  • LLaMA-Factory微调教程4:模型评估
  • Spring Boot + ShardingSphere 分库分表实战
  • 【CVPR2025】计算机视觉|AnomalyNCD:让工业异常分类“脱胎换骨”!
  • 计算机视觉(2)车规摄像头标准
  • YOLO11涨点优化:原创自研DSAM注意力!基于BiLevelRoutingAttention的颠覆性升级
  • nodejs 封装方法将打印日志输出到指定文件
  • javacc实现简单SQL解析器
  • Llama 3词汇表揭秘:128,000个token解析:merges 是子词分词算法
  • 数据结构——单向链表部分操作及valgrind安装
  • Exporters | 安装mongodb_exporter
  • 数据分页异步后台导出excel
  • 【Ubuntu】请问,`ip -a`显示的“wlo1”是什么呀?
  • 笔试——Day28
  • 如何在 Ubuntu 24.04 上安装和配置 TFTP 服务器