数据算法
- 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;
}