蓝桥杯C++——sort排序2

浮点数排序

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

#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
const double EPSILON=1e-6;
double num[105];
bool cmp(double a,double b)
{
	double da=fabs(a-round(a));
	double db=fabs(b-round(b));
	if(fabs(da-db)<EPSILON)
	{
		return a<b;
	}
	return da<db;
}
int main()
{
	int N;
	scanf("%d",&N);
	for(int i=0;i<N;i++)
	{
		scanf("%lf",&num[i]);
	}
	sort(num,num+N,cmp);
	for(int i=0;i<N;i++)
	{
		if(i!=N-1)
		{
			printf("%lf ",num[i]);//默认是%lf就是六位
		}
		else
		{
			printf("%lf\n",num[i]);
		}
	}
	return 0;
}
double da=fabs(a-round(a));
  • 在C++中,round()是一个数学函数,用于将一个浮点数四舍五入为最接近的整数。它的函数原型如下:
    double round(double x);
  • 例如,对于输入值3.4,round()函数将返回3,而对于输入值3.6,round()函数将返回4。需要注意的是,round()函数返回的是一个double类型的值,因此需要进行类型转换才能得到整数类型的结果。

分数线

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

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int score[100005];
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)//输入
	{
		scanf("%d",&score[i]);
	}
	sort(score,score+n,greater<int>());//从大到小排
	printf("%d ",score[(n-1)/2]);//中位数
	int cnt=0;
	for(int i=0;i<n;i++)//判断
	{
		if(score[i]<score[(n-1)/2])
		{
			break;
		}
		cnt++;
	}
	printf("%d",cnt);
	return 0;
} 

交叉排序

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

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int num[10005];
int main()
{
	int N,l1,r1,l2,r2;
	scanf("%d%d%d%d%d",&N,&l1,&r1,&l2,&r2);
	for(int i=0;i<N;i++)
	{
		scanf("%d",&num[i]);
	}
	sort(num+l1-1,num+r1);//数组,下标要-1 
	sort(num+l2-1,num+r2,greater<int>());
	for(int i=0;i<N;i++)
	{
		if(i!=N-1)//控制结尾空格
		{
			printf("%d ",num[i]);
		}
		else
		{
			printf("%d\n",num[i]);
		}
	}
	return 0;
} 

红绿蓝

在这里插入图片描述
+

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
char s[10005];
int main()
{
	scanf("%s",s);
	int len=strlen(s);
	sort(s,s+len);
	printf("%s\n",s);
	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++;
		}
	}
	int num=min(r,min(g/2,b/3));//比较并返回两个数的最小值 ,三个数需要用两个min 
	printf("%d\n",num);
	return 0;
} 

整数排序进阶

在这里插入图片描述

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int arr [110];
int sum(int n)//各位数字相加 
{
	int b=0;
	while(n>0)
	{
	
	b+=n%10;
	n/=10;
	}
	return b;
}
bool cmp(int x,int y)//排序 
{
	int dx,dy;
	dx=sum(x);
	dy=sum(y);
	if(dx==dy)
	{
		return x<y;
	}
	else
	{
		return dx<dy;
	}
	
}
int main()
{
	int N;
	scanf("%d",&N);//输入 
	for(int i=0;i<N;i++)
	{
		scanf("%d",&arr[i]);
	}
	sort(arr,arr+N,cmp);
	for(int i=0;i<N;i++)//输出 
	{
		if(i!=N-1)
		{
			printf("%d ",arr[i]);
		}
		else
		{
			printf("%d\n",arr[i]);
		}
	}	
	return 0;
} 

成绩排序

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

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct Student
{
	int score;
	int id;
}; 
Student stu[105];
bool cmp(Student x,Student y)
{
	return x.score>y.score;
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&stu[i].score);
		stu[i].id=i+1;
	}
	sort(stu,stu+n,cmp);
	for(int i=0;i<n;i++)
	{
		if(i!=n-1)
		{
			printf("%d ",stu[i].id);
		}
		else
		{
			printf("%d\n",stu[i].id);
		}
	}
	return 0;
} 

成绩排序进阶

在这里插入图片描述

在这里插入图片描述

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct Student
{
	char name[105];
	int score[4];
}; 
Student stu[105];
bool cmp1(Student x,Student y)//语文成绩排序
{
	if(x.score[0]!=y.score[0])
	{
		return x.score[0]>y.score[0];
	}
	return strcmp(x.name,y.name)<0;
}
bool cmp2(Student x,Student y)//数学
{
	if(x.score[1]!=y.score[1])
	{
		return x.score[1]>y.score[1];
	}
	return strcmp(x.name,y.name)<0;
}
bool cmp3(Student x,Student y)英语
{
	if(x.score[2]!=y.score[2])
	{
		return x.score[2]>y.score[2];
	}
	return strcmp(x.name,y.name)<0;
}
bool cmp4(Student x,Student y)科学
{
	if(x.score[3]!=y.score[3])
	{
		return x.score[3]>y.score[3];
	}
	return strcmp(x.name,y.name)<0;
}
bool cmp5(Student x,Student y)//总分
{
	int suma=0,sumb=0;
	for(int i=0;i<4;i++)
	{
		suma+=x.score[i];
		sumb+=y.score[i];
	} 
	if(suma!=sumb)
	{
		return suma>sumb;
	}
	return strcmp(x.name,y.name)<0;
}
void print()//打印
{
	for(int i=0;i<3;i++)
	{
		printf("%s ",stu[i].name);
	}
	printf("%s\n",stu[3].name);
}
int main()
{
	int N;
	scanf("%d",&N);
	for(int i=0;i<N;i++)
	{
		scanf("%s",stu[i].name);
		for(int j=0;j<4;j++)
		{
			scanf("%d",&stu[i].score[j]);
		}
	}
	sort(stu,stu+N,cmp1);
	print();
	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;
} 

抢气球

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

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct Children{
	int a;
	int id;
};
bool cmp(Children x,Children y)
{
	return x.a<y.a;
}
Children child[1005];
int ans[1005]; //抢到气球个数
int h[1005];//气球高度
bool used[1005];//记录是否已被抢到
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)//输入
	{
		scanf("%d",&child[i].a);
		child[i].id=i;
	}
	for(int i=0;i<m;i++)//输入
	{
		scanf("%d",&h[i]);
	}
	sort(child,child+n,cmp);//排序
	for(int i=0;i<n;i++)//判断,时间复杂度为O(nm)
	{
		for(int j=0;j<m;j++)
		{
			if(!used[j]&&h[j]<=child[i].a)
			{
				ans[child[i].id]++;
				used[j]=true;
			}
		}
	}
	for(int i=0;i<n;i++)
	{
		printf("%d\n",ans[i]);
	}
	return 0;
}

抢气球升级版

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

  • 此题1<=n.m<=十的五次方,按照上题的计算方法,时间复杂度为O(nm),机器运行时间可能过长
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct Children{
	int a;
	int id;
};
bool cmp(Children x,Children y)
{
	return x.a<y.a;
}
Children child[1005];
int ans[1005]; 
int h[1005];
int main()
{
	int n,m,p;
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&child[i].a);
		child[i].id=i;
	}
	for(int i=0;i<m;i++)
	{
		scanf("%d",&h[i]);
	}
	sort(child,child+n,cmp);
	sort(h,h+m);
	p=0;
	for(int i=0;i<n;i++)//时间复杂度为O(n+m) 
	{
		while(p<m&&h[p]<=child[i].a)
		{
			ans[child[i].id]++;
			p++;
		}
	}
	for(int i=0;i<n;i++)
	{
		printf("%d\n",ans[i]);
	}
	return 0;
}
  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值