数据算法
- 1310:【例2.2】车厢重组
 - 1176:谁考了第k名
 - 1177:奇数单增序列
 - 1178:成绩排序
 - 1179:奖学金
 - 1180:分数线划定
 - 1181:整数奇偶排序
 
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:成绩排序

 
 由题目可知,一个学生有名字和成绩两个属性,我们用到结构体来存储。
- 定义结构体,然后声明结构体数组并输入值。
 - 对学生成绩进行sort排序,自定义比较函数让成绩从大到小,成绩相等则让名字按字母从小到大。
 - 最后输出结果。
 
//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个属性。那我们定义结构体完成。
- 定义结构体,然后声明结构体数组并输入值,对学号赋值。
 - 依次对总分、语文成绩、学号进行sort排序,自定义比较函数让总分从大到小,总分相等则让语文成绩从大到小,不然就按学号从小到大。
 - 最后输出前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%的人分数线。我们知道一个学生有学号和成绩两个属性,用结构体做。
- 定义结构体,然后声明结构体数组并输入值。
 
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;
	}
 
- 面试后要先录取成绩最好的,也就是我们要事先对成绩进行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);
 
- 排完序后找第m名 x 150%的分数,用 p 变量存储
 
int cnt=0, p = stu[int(m*1.5)-1].score; //分数向下取整
 
- 接着求比第p名的分数线大的人数cnt。循环比较一下,大于等于p就次数+1。
 
for(int i=0;i<n;i++){
		if(stu[i].score>=p){
			cnt++;
		}
	}
 
- 最后依次输出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;
}
                


















