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

数据算法

    • 1310:【例2.2】车厢重组
    • 1176:谁考了第k名
    • 1177:奇数单增序列
    • 1178:成绩排序
    • 1179:奖学金
    • 1180:分数线划定
    • 1181:整数奇偶排序

1310:【例2.2】车厢重组

信奥赛一本通算法 第二章数据排序(【例2.2】车厢重组、谁考了第k名、奇数单增序列、成绩排序、奖学金、分数线划定、整数奇偶排序)_第1张图片
这道题简单,题目说相邻值交换,而且是排序算法,那我们一推就知道是冒泡排序。
那只要交换值,就让我们次数+1,排序结束输出即可!

//1310:【例2.2】车厢重组
#include
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名

信奥赛一本通算法 第二章数据排序(【例2.2】车厢重组、谁考了第k名、奇数单增序列、成绩排序、奖学金、分数线划定、整数奇偶排序)_第2张图片
有题目可知,一个学生有两个属性 学号与成绩;我们可以用结构体保存结果。
定义与输入搞定后,我们要对成绩排一下序,高到低。
需要用到sort排序,自定义比较函数cmp。
最后输出第K名的成绩即可。

#include
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:奇数单增序列

信奥赛一本通算法 第二章数据排序(【例2.2】车厢重组、谁考了第k名、奇数单增序列、成绩排序、奖学金、分数线划定、整数奇偶排序)_第3张图片
信奥赛一本通算法 第二章数据排序(【例2.2】车厢重组、谁考了第k名、奇数单增序列、成绩排序、奖学金、分数线划定、整数奇偶排序)_第4张图片
输入值到数组,然后进行排序,用sort排序,cmp自定义比较:奇数在前偶数在后。输出要逗号。我们可以输出一个值带一个逗号,注意循环输出只到倒数第二个数。

//1177:奇数单增序列
#include
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:成绩排序

信奥赛一本通算法 第二章数据排序(【例2.2】车厢重组、谁考了第k名、奇数单增序列、成绩排序、奖学金、分数线划定、整数奇偶排序)_第5张图片
信奥赛一本通算法 第二章数据排序(【例2.2】车厢重组、谁考了第k名、奇数单增序列、成绩排序、奖学金、分数线划定、整数奇偶排序)_第6张图片
由题目可知,一个学生有名字和成绩两个属性,我们用到结构体来存储。

  1. 定义结构体,然后声明结构体数组并输入值。
  2. 对学生成绩进行sort排序,自定义比较函数让成绩从大到小,成绩相等则让名字按字母从小到大。
  3. 最后输出结果。
//1178:成绩排序
#include
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:奖学金

信奥赛一本通算法 第二章数据排序(【例2.2】车厢重组、谁考了第k名、奇数单增序列、成绩排序、奖学金、分数线划定、整数奇偶排序)_第7张图片
由题目可知,我们一个学生有 语数英成绩、学号、总分等5个属性。那我们定义结构体完成。

  1. 定义结构体,然后声明结构体数组并输入值,对学号赋值。
  2. 依次对总分、语文成绩、学号进行sort排序,自定义比较函数让总分从大到小,总分相等则让语文成绩从大到小,不然就按学号从小到大。
  3. 最后输出前5名的学号与总分结果。
//1179:奖学金
#include
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:分数线划定

信奥赛一本通算法 第二章数据排序(【例2.2】车厢重组、谁考了第k名、奇数单增序列、成绩排序、奖学金、分数线划定、整数奇偶排序)_第8张图片在这里插入图片描述信奥赛一本通算法 第二章数据排序(【例2.2】车厢重组、谁考了第k名、奇数单增序列、成绩排序、奖学金、分数线划定、整数奇偶排序)_第9张图片
由题目可知,面试分数线是第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
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:整数奇偶排序

信奥赛一本通算法 第二章数据排序(【例2.2】车厢重组、谁考了第k名、奇数单增序列、成绩排序、奖学金、分数线划定、整数奇偶排序)_第10张图片
由题目可知,定义一维数组并输入10个数。然后进行sort排序,自定义比较过程。

//1181:整数奇偶排序
#include 
#include 
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;
}

你可能感兴趣的:(算法,c++)