第 2 章 Xin Olympiad アルゴリズムのデータソート ([例 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回目の試験に合格したのは誰ですか?

ここに画像の説明を挿入します
質問から、学生には学生番号と学年という 2 つの属性があることがわかり、構造体を使用して結果を保存できます。
定義と入力が完了したら、スコアを高いものから低いものまでランク付けする必要があります。
ソートソートとカスタム比較関数 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: 奇数の単一増加シーケンス

ここに画像の説明を挿入します
ここに画像の説明を挿入します
配列に値を入力し、並べ替えます。並べ替えには並べ替えを使用します。cmp カスタム比較: 奇数が最初、偶数が最後です。出力にはカンマが必要です。カンマを使用して値を出力できますが、ループ出力は最後から 2 番目の数値までしか到達しないことに注意してください。

//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: スコアソート

ここに画像の説明を挿入します
ここに画像の説明を挿入します
タイトルからわかるように、学生には名前と学年という 2 つの属性があり、構造体を使用してそれらを保存します。

  1. 構造体を定義し、構造体配列を宣言して値を入力します。
  2. 生徒のスコアを並べ替え、スコアが大きいものから小さいものへと並べ替えられるように比較関数をカスタマイズします。スコアが等しい場合、名前は小さいものから大きいもののアルファベット順に並べられます。
  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年: 奨学金

ここに画像の説明を挿入します
タイトルから分かるように、私たちの生徒の 1 人は、中国語、数学、英語のスコア、生徒数、合計スコアの 5 つの属性を持っています。次に、完成する構造を定義します。

  1. 構造体を定義し、構造体配列を宣言して値を入力し、学生番号を割り当てます。
  2. 合計スコア、中国語スコア、学生番号を順に並べ替えます。カスタム比較関数により、合計スコアが高い方から低い方に進みます。合計スコアが等しい場合、中国語のスコアは高い方から低い方に進みます。それ以外の場合、学生番号は次のようになります。小さいものから高いものまで並べられています。
  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位×減点の150%となります。学生には、学生番号と学年という 2 つの属性があり、これらは構造を使用して作成されることがわかっています。

  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. 面接の後、最高のスコアを持つ候補者が最初に入学する必要があります。つまり、事前にスコアを分類する必要があります。結果は一貫して、生徒数の最小値から最大値の順に並べ替えられます。
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 番目のスコアラインよりも大きい人の数を求めます。ループで比較し、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: 整数の奇数偶数ソート

ここに画像の説明を挿入します
質問からもわかるように、1 次元配列を定義し、10 個の数値を入力します。次に、比較プロセスを並べ替えてカスタマイズします。

//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