算法--sort

头文件
在这里插入图片描述
sort(数组名,数组名加比较的元素个数)
实际上比较的是a[0]到a[i-1]
在这里插入图片描述
前K名的平均数
在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>
int score[35];
using namespace std;

int main(){
	int N;
	cin>>N;
	int k;
	double ans=0;
	for(int i=0;i<N;i++){
		cin>>score[i];
	}
	cin>>k; 
	sort(score,score+N,greater<int>());
	for(int i=0;i<k;i++){
		ans+=score[i];
	}
	cout<< ans/k;
	return 0;
}

 

分数段统计
在这里插入图片描述在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>

using namespace std;
int A[35];
int B[7]={0};
int main(){
int N;
cin>>N;
for(int i=0;i<N;i++){
cin>>A[i]; }
sort(A,A+N,greater<int>());
for(int i=0;i<N;i++){
	if(A[i]==100)
	B[1]++;
	else if(A[i]<=99&&A[i]>=90){
		B[2]++;
	}else if(A[i]<=89&&A[i]>=80){
		B[3]++;
	}else if(A[i]<=79&&A[i]>=70)
	B[4]++;
	else if(A[i]<=69&&A[i]>=60){
		B[5]++;
	}
	else B[6]++;
}
for(int i=0;i<N;i++){
	cout<<A[i]<<endl;
}
for(int i=1;i<=6;i++ ){
	cout<<B[i]<<" ";
}

	return 0;
}

 

如果知道有多少个数如何控制换行
在这里插入图片描述
如果不知道有多少个数就第一个数只打印数本身
后面的数就先空格再数本身
sort 再传入一个参数cmp,来告诉它这个怎么排
sort(arr,arr+10,cmp);
在这里插入图片描述在这里插入图片描述
注意cmp的返回值
布尔类型的

在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>

using namespace std;
int A[103];
bool cmp(int x,int y){
	if(x%3!=y%3){
		return x%3<y%3;
	}else return x<y;
}//忽然发现这个函数好神奇
//真是让干啥干啥
//你直接把想要的顺序写成关系式当成返回值就行了 
int main(){
int N;
cin>>N;
for(int i=0;i<N;i++){
	scanf("%d",&A[i]);
}
sort(A,A+N,cmp);
for(int i=0;i<N;i++){
	if(i!=N-1)
	printf("%d",A[i]);
	else printf("%d\n",A[i]);
}

	return 0;
}

 

结构体的构造函数
在这里插入图片描述
结构体排序
在这里插入图片描述
评奖1在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>

using namespace std;
struct student{
	char name[10];
	int score[4];
}; 
 bool cmp(student x,student y){
 	int sumx=x.score[0]+x.score[1]+x.score[2]+x.score[3];
 	int sumy=y.score[0]+y.score[1]+y.score[2]+y.score[3];
 return sumx>sumy;
 }
int main(){
int N;
cin>>N;
student stu[N];
for(int i=0;i<N;i++){
cin>>stu[i].name;
for(int j=0;j<4;j++){
	cin>>stu[i].score[j];
}
}
sort(stu,stu+N,cmp);
for(int i=0;i<N;i++ ){
	cout<<stu[i].name<<endl;
}
	return 0;
}

 

浮点数排序
1.计蒜客–浮点数排序

我们有 N 个正浮点数,均小于
10000.0。现在需要将这些浮点数按照离它最近的整数的差从小到大排序,浮点数与距离最近的整数的差越小,这个浮点数的排位越靠前;如果差相等,按照浮点数的值从小到大排序。

判断浮点数相等应该使用如下语句:

if (fabs(a - b) < EPSILON) {
//执行当两个浮点数 a 和 b 相等时的操作
}
其中 EPSILON 为常量,大小为 10^{-6}。

输入格式

输入有 2 行 第一行为一个整数 N,0 < N < 101; 第二行为用空格隔开的 N 个正浮点数,均小于 10000.0。

输出格式

输出有 1 行,为按照题目要求排序后的 N 个正浮点数,四舍五入保留 6 位小数,用空格隔开。

样例输入

9
1.001 2.1 3.2 4.0001 5.000001 6.9 7.2 8.001 9.0

1
2

样例输出

9.000000 5.000001 4.000100 1.001000 8.001000 2.100000 6.900000 3.200000 7.200000

#include<iostream>
#include<string.h>
#include<algorithm>
#include<cmath> 
const double EP=1e-6;//两个数之差小于这个情况下认为这两个数相等 
double num[105]; 
using namespace std;
bool cmp(double a,double b){
	//要讲这些数与离得最近的整数排序
	//那肯定要将这些数与自己离得最近的整数相减并取绝对值
	//然后再判断大小 
	double da =fabs(a-round(a));
	double db=fabs(b-round(b));
	 if(fabs(da-db)<EP){
	 	return a<b;
	 } 
	 else return da<db;	
}
int main(){
int N;
scanf("%d",&N);
for(int i=0;i<N;i++){
	cin>>num[i];
}
sort(num,num+N,cmp);
for(int i=0;i<N;i++){
	if(i!=N-1){
		cout<<num[i]<<" ";
	}
	else cout<<num[i]<<endl;
}
	return 0;
}

 

分数线

在这里插入图片描述在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>
#include<cmath> 

int  num[100005]; 
using namespace std;

int main(){
int N;
scanf("%d",&N);
for(int i=0;i<N;i++){
	cin>>num[i];
}
sort(num,num+N,greater<int>());
int line=num[(N-1)/2];
int n=0;
for(int i=0;i<N;i++){
	if(num[i]>=num[(N-1)/2]){
		n++;
	}else break;
}
cout<<line<<" "<<n;

	return 0;
}

 

在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>
#include<cmath> 
 
int  num[100005]; 
using namespace std;

int main(){
int N,l1,r1,l2,r2;
cin>>N>>l1>>r1>>l2>>r2;
for(int i=0;i<N;i++){
	cin>>num[i];
}
sort(num+l1-1,num+r1);
sort(num+l2-1,num+r2,greater<int>());
int line=num[(N-1)/2];
int n=0;
for(int i=0;i<N;i++){
cout<<num[i]<<" ";
}
	return 0;
}

 

在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>
#include<cmath> 

using namespace std;
char s[10005];
int main(){
	cin>>s;
int len=strlen(s);
sort(s,s+len);
cout<<s<<endl; 
//穿珠子是看这几个颜色的数量,哪个最小就是收链的限制量
 //一红二绿 三蓝
 //先通过扫描得出每个颜色珠子的数量
  int r=0,g=0,b=0;
  for(int i=0;i<len;i++){
  	if(s[i]=='R')r++;
  	else if(s[i]=='G')g++;
  	else if(s[i]=='B')b++;
  } 
  //用min()来进行一个最小的寻找,min只能传两个参数
   cout<<min(r,min(g/2,b/3))<<endl; 
  

	return 0;
}

 

在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>
#include<cmath> 
using namespace std;

bool cmp(int a,int b){
	int suma=0,sumb=0;
	//注意一定要建立两个变量保存a,b的初始值 
	int aa=a;int bb=b; 
	while(a){
	suma+=a%10;
	a/=10;
	
	} 
	while(b){
	sumb+=b%10;
	b/=10;
	} 
	if(suma==sumb){
		return aa<bb;
	}
	return suma<sumb;
} 
int num[105];

int main(){
	int N;
	cin>>N;

  for(int i=0;i<N;i++){
  cin>>num[i];
}
sort(num,num+N,cmp);
for(int i=0;i<N;i++){
	if(i!=N-1){
	
	cout<<num[i]<<" ";
	}else cout<<num[i]<<endl;
	// 一定要不打出那个行末空格 
}
	return 0;
}

 

在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>
#include<cmath> 
using namespace std;


struct student{
	int score;
	int id;
	
};
student stu[105];

bool cmp(student a,student b){
	return a.score>b.score;
} 


int main(){
	int N;
	cin>>N;

  for(int i=0;i<N;i++){
  cin>>stu[i].score;
  stu[i].id=i+1;
}
sort(stu,stu+N,cmp);
//注意结构体数组排序,只需要输入数组名,然后cmp里定义你具体用结构体的哪个变量排
 
for(int i=0;i<N;i++){
	if(i!=N-1){
	
	cout<<stu[i].id<<" ";
	}else cout<<stu[i].id<<endl;
	// 一定要不打出那个行末空格 
}
	return 0;
}

 

成绩排序升级版
在这里插入图片描述
5
Alice 99 98 97 96
Bob 98 97 96 94
Coy 94 94 95 96
Dan 93 95 96 97
Evan 0 94 95 95
在这里插入图片描述

#include<iostream>
#include<bits/stdc++.h>
#include<string>
#include<algorithm>
#include<cmath> 
using namespace std;


struct student{
	int score[4];
	char name[105];
	
};
student stu[125];

bool cmp1(student a,student b){
	if(a.score[0]!=b.score[0]){
			return a.score[0]>b.score[0];
	}return (strcmp(a.name,b.name)<0);

} 

bool cmp2(student a,student b){
	if(a.score[1]!=b.score[1]){
			return a.score[1]>b.score[1];
	}return strcmp(a.name,b.name)<0;

} 
bool cmp3(student a,student b){
	if(a.score[2]!=b.score[2]){
			return a.score[2]>b.score[2];
	}return strcmp(a.name,b.name)<2;

} 
bool cmp4(student a,student b){
	if(a.score[3]!=b.score[3]){
			return a.score[3]>b.score[3];
	}return strcmp(a.name,b.name)<3;

} 
bool cmp5(student a,student b){
	int suma=0;int sumb=0;
	for(int i=0;i<4;i++){
		suma+=a.score[i];
		sumb+=b.score[i];
	}
	if(suma!=sumb){
			return suma>sumb;
	}return strcmp(a.name,b.name)<0;

} 
void print(){
	for(int i=0;i<3;i++){
		cout<<stu[i].name;
	}
	cout<<stu[3].name<<endl;
	 
}
int main(){
	int N;
	cin>>N;

  for(int i=0;i<N;i++){
  cin>>stu[i].name;
  for(int j=0;j<4;j++){
  
   cin>>stu[i].score[j];
}}
sort(stu,stu+N,cmp1);
print();
//注意结构体数组排序,只需要输入数组名,然后cmp里定义你具体用结构体的哪个变量排
 sort(stu,stu+N,cmp2);
 print();
sort(stu,stu+N,cmp3);
print();
sort(stu,stu+N,cmp4);
print();
sort(stu,stu+N,cmp5);
print();
	return 0;
}

 

在这里插入图片描述
问题描述
  教室的墙上挂满了气球,五颜六色,小朋友们非常喜欢。
  刚一下课,小朋友们就打算去抢这些气球。每个气球在墙上都有一定的高度,只有当小朋友跳起来时,手能够到的高度大于等于气球的高度,小朋友才能摘到这个气球。为了公平起见,老师让跳的低的小朋友先摘,跳的高的小朋友后摘小朋友都很贪心,每个小朋友在摘气球的时候都会把自己能摘的气球都摘掉。
  很巧的是,小朋友们跳起来手能够着的高度都不一样,这样就不会有跳起来后高度相同的小朋友之间发生争执了。
【输入格式】
  第一行输入两个空格分隔的整数n,m,其中n表示小朋友的数量,m表示墙上气球的数量。
  第二行输入n个正整数(每两个整数之间用空格隔开),第i个数为 ai,表示第i个小朋友跳起来手能够着的高度为ai。
  第三行输入m个正整数(每两个整数之间用空格隔开),第i个数为 hi,表示第i个气球的高度为hi。
【输出格式】
  输出一共n行,每行一个整数。第i行表示第i个小朋友摘到的气球数量。
【输入样例】
【样例1】
   5 6
   3 7 9 6 4
   1 2 3 4 5 6
  【样例2】
   10 10
   1 2 3 4 5 6 7 8 9 10
   3 1 4 6 7 8 9 9 4 12
【输出样例】
【样例1】
   3
   0
   0
   2
   1
  【样例2】
   1
   0
   1
   2
   0
   1
   1
   1
   2
0

#include<iostream>
#include<bits/stdc++.h>
#include<string>
#include<algorithm>
#include<cmath> 
using namespace std;


struct child{
	int a;//小朋友的高度 
	char id;
	
};
child c[1005];
int h[1005];
int ans[1005];
bool used[1005];
bool cmp1(child a,child b){
return a.a<b.a;
} 



int main(){
	int n,m;
	cin>>n>>m;
	for(int i=0;i<n;i++){
		cin>>c[i].a;
		c[i].id=i;
	}
	for(int i=0;i<m;i++){
		cin>>h[i];
	}
	sort(c,c+n,cmp1);
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(!used[j]&&h[j]<=c[i].a){
				ans[c[i].id]++;
				used[j]=true;
			}
		}
	}
	for(int i=0;i<n;i++){
		cout<<ans[i]<<endl;
	}

	return 0;
}

 

如果人数要求多了
那就不能设标志位数组了
而是建立一个变量用来记录已经选过的气球。
下一个小朋友开始选的时候就从没被选过的气球开始选
从而降低了复杂度
但是气球高度数组也要有一个排序
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值