这道题简单,题目说相邻值交换,而且是排序算法,那我们一推就知道是冒泡排序。
那只要交换值,就让我们次数+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;
}
有题目可知,一个学生有两个属性 学号与成绩;我们可以用结构体保存结果。
定义与输入搞定后,我们要对成绩排一下序,高到低。
需要用到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;
}
输入值到数组,然后进行排序,用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:成绩排序
#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;
}
由题目可知,我们一个学生有 语数英成绩、学号、总分等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;
}
由题目可知,面试分数线是第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;
}
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);
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;
}
总代码如下:
//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;
}
由题目可知,定义一维数组并输入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;
}