浮点数排序
#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;
}