头文件
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;
}
结构体的构造函数
结构体排序
#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;
}
如果人数要求多了
那就不能设标志位数组了
而是建立一个变量用来记录已经选过的气球。
下一个小朋友开始选的时候就从没被选过的气球开始选
从而降低了复杂度
但是气球高度数组也要有一个排序