信奥赛一本通算法 第二章数据排序(【例2.2】车厢重组、谁考了第k名、奇数单增序列、成绩排序、奖学金、分数线划定、整数奇偶排序)

1310:【例2.2】车厢重组

在这里插入图片描述
这道题简单,题目说相邻值交换,而且是排序算法,那我们一推就知道是冒泡排序。
那只要交换值,就让我们次数+1,排序结束输出即可!

//1310:【例2.2】车厢重组
#include<bits/stdc++.h>
using namespace std;
int a[10001];
int main(){
    
    
	int n,cnt=0;
	cin>>n;
	for(int i=0;i<n;i++){
    
    
		cin>>a[i];
	}
	for(int i=n-1;i>=0;i--){
    
    
		bool flag=false;
		for(int j=0;j<i;j++){
    
    
			if(a[j]>a[j+1]){
    
    
				swap(a[j],a[j+1]);
				flag=true;
				cnt++;
			}
		}
		if(flag==false){
    
    
			break;
		}
	}
	cout<<cnt;
	return 0;
} 

1176:谁考了第k名

在这里插入图片描述
有题目可知,一个学生有两个属性 学号与成绩;我们可以用结构体保存结果。
定义与输入搞定后,我们要对成绩排一下序,高到低。
需要用到sort排序,自定义比较函数cmp。
最后输出第K名的成绩即可。

#include<bits/stdc++.h>
using namespace std;
struct Student{
    
    
    int name;  // 学生名字 
    float score; // 存三个成绩 语数英 
}; 
bool cmp(Student x,Student y){
    
    
	return x.score>y.score;
}
int main(){
    
    
	int n,k;
	cin>>n>>k;
	Student stu[n+1];
	for(int i=0;i<n;i++){
    
    
		cin>>stu[i].name>>stu[i].score;
	}
	sort(stu,stu+n,cmp);
	cout<<stu[k-1].name<<" "<<stu[k-1].score;
	return 0;
}

1177:奇数单增序列

在这里插入图片描述
在这里插入图片描述
输入值到数组,然后进行排序,用sort排序,cmp自定义比较:奇数在前偶数在后。输出要逗号。我们可以输出一个值带一个逗号,注意循环输出只到倒数第二个数。

//1177:奇数单增序列
#include<bits/stdc++.h>
using namespace std;
int main(){
    
    
	int n,a[1000],j=0;
	cin>>n;
	for(int i=0;i<n;i++){
    
    
		int k;
		cin>>k;
		if(k%2) a[j++]=k;
	}
	sort(a,a+j);
	for(int i=0;i<j-1;i++){
    
    
		cout<<a[i]<<",";
	}
	cout<<a[j-1];
	return 0;
} 

1178:成绩排序

在这里插入图片描述
在这里插入图片描述
由题目可知,一个学生有名字和成绩两个属性,我们用到结构体来存储。

  1. 定义结构体,然后声明结构体数组并输入值。
  2. 对学生成绩进行sort排序,自定义比较函数让成绩从大到小,成绩相等则让名字按字母从小到大。
  3. 最后输出结果。
//1178:成绩排序
#include<bits/stdc++.h>
using namespace std;
struct Student{
    
    
    string name;  // 学生名字 
    int score; 
}; 
bool cmp(Student x,Student y){
    
    
	if(x.score!=y.score) return x.score>y.score;
	else return x.name<y.name;
}
int main(){
    
    
	int n;
	cin>>n;
	Student stu[n+1];
	for(int i=0;i<n;i++){
    
    
		cin>>stu[i].name>>stu[i].score;
	}
	sort(stu,stu+n,cmp);
	for(int i=0;i<n;i++){
    
    
		cout<<stu[i].name<<" "<<stu[i].score<<endl;
	}
	return 0;
}

1179:奖学金

在这里插入图片描述
由题目可知,我们一个学生有 语数英成绩、学号、总分等5个属性。那我们定义结构体完成。

  1. 定义结构体,然后声明结构体数组并输入值,对学号赋值。
  2. 依次对总分、语文成绩、学号进行sort排序,自定义比较函数让总分从大到小,总分相等则让语文成绩从大到小,不然就按学号从小到大。
  3. 最后输出前5名的学号与总分结果。
//1179:奖学金
#include<bits/stdc++.h>
using namespace std;
struct Student {
    
    
    int score[3],total,id;
};
bool cmp(Student x,Student y){
    
    
	if(x.total!=y.total) 
		return x.total>y.total;
	if(x.total==y.total && x.score[0]!=y.score[0]) 
		return x.score[0]>y.score[0];
	if(x.total==y.total && x.score[0]==y.score[0])
		return x.id < y.id;
}
int main() {
    
    
	int n;
	cin>>n;
    Student stu[n+1];
    for (int i=0; i<n; i++){
    
    
    	stu[i].id = i+1;
    	stu[i].total=0; 
    	for(int j=0;j<3;j++){
    
    
    		cin>>stu[i].score[j];
    		stu[i].total += stu[i].score[j];	
		}
    }
    sort(stu,stu+n,cmp);
    for(int i=0; i<5; i++){
    
     
        cout<<stu[i].id<<" "<<stu[i].total<<endl;
    }
    
    return 0;
}

1180:分数线划定

在这里插入图片描述在这里插入图片描述在这里插入图片描述
由题目可知,面试分数线是第M名 x 150%的人分数线。我们知道一个学生有学号和成绩两个属性,用结构体做。

  1. 定义结构体,然后声明结构体数组并输入值。
struct Student{
    
    
    int id;   
    int score; 
}; 
int main(){
    
    
	int n,m;
	cin>>n>>m;
	Student stu[n+1];
	for(int i=0;i<n;i++){
    
    
		cin>>stu[i].id>>stu[i].score;
	}
  1. 面试后要先录取成绩最好的,也就是我们要事先对成绩进行sort排序。成绩一致按学号从小到大排序。
bool cmp(Student x,Student y){
    
     //主函数外
	if(x.score!=y.score) return x.score>y.score;
	return x.id<y.id;
}
//主函数内
sort(stu,stu+n,cmp);
  1. 排完序后找第m名 x 150%的分数,用 p 变量存储
int cnt=0, p = stu[int(m*1.5)-1].score; //分数向下取整
  1. 接着求比第p名的分数线大的人数cnt。循环比较一下,大于等于p就次数+1。
for(int i=0;i<n;i++){
    
    
		if(stu[i].score>=p){
    
    
			cnt++;
		}
	}
  1. 最后依次输出cnt名的学号与成绩。
cout<<stu[cnt-1].score<<" "<<cnt<<endl;
	for(int i=0;i<cnt;i++){
    
    	
		cout<<stu[i].id<<" "<<stu[i].score<<endl;
	}

总代码如下:

//1180:分数线划定
#include<bits/stdc++.h>
using namespace std;
struct Student{
    
    
    int id;   
    int score; 
}; 
bool cmp(Student x,Student y){
    
    
	if(x.score!=y.score) return x.score>y.score;
	return x.id<y.id;
}
int main(){
    
    
	int n,m;
	cin>>n>>m;
	Student stu[n+1];
	for(int i=0;i<n;i++){
    
    
		cin>>stu[i].id>>stu[i].score;
	}
	sort(stu,stu+n,cmp);
	
	int cnt=0, p = stu[int(m*1.5)-1].score;
	for(int i=0;i<n;i++){
    
    
		if(stu[i].score>=p){
    
    
			cnt++;
		}
	}
	cout<<stu[cnt-1].score<<" "<<cnt<<endl;
	for(int i=0;i<cnt;i++){
    
    	
		cout<<stu[i].id<<" "<<stu[i].score<<endl;
	}
	return 0;
}

1181:整数奇偶排序

在这里插入图片描述
由题目可知,定义一维数组并输入10个数。然后进行sort排序,自定义比较过程。

//1181:整数奇偶排序
#include <iostream>
#include <algorithm>
using namespace std;
bool mycmp (int a,int b){
    
    
    if(a % 2 != b % 2){
    
    
        return a % 2 > b % 2;
    }
    if(a % 2 == b % 2){
    
    
    	if(a%2!=0) return a>b;
		else  return a<b;
	}
}
int main() {
    
    
    int arr[11],i=0;
//    while(cin>>arr[i++]){
    
    
//    	;
//	}
	for(int i=0;i<10;i++){
    
    
		cin>>arr[i];
	}
    sort(arr,arr + 10,mycmp);
    for (int i = 0; i < 10; i++) {
    
    
        cout << arr[i] <<" ";
    }
    cout << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44775255/article/details/134017782
今日推荐