マシン演習3上の第二章「を通じて情報オリンピック」:のために書かれました
タイトル説明
辞書的に同じ割合プレス最小の最初の名前があればクラスは、出力をソートレポートカード上の自分のスコアによるとしてください、転写産物のコースを与えています。
コンセプトしばしば遭遇する「辞書編集」、そう覚えている-辞書式順序が辞書に表示される文字列である、またはページ番号はまた、文字として、辞書に表示される文字列として理解することができます(注:文字列「りんご」は、以前の「バナナ」、「りんご」「バナナ」小さなより辞書順)より順に辞書に表示されます。
入力形式
最初の行は整数が含まれ(N-LT \ル1000)\ \ N-(0)\を、クラスの生徒数を表し、
次の\を(N \)ライン、各学生の名前と彼の業績の各行動、単一のスペースで区切られています。名前は、もはやよりも文字だけと含まれていません\(20 \) 、以下のスコア\(100 \)非負整数を。
出力フォーマット
順序および出力を降順にソートスコアによってレポートカードは、各行は名前とスコア2を含有する、間にスペースがあります。
サンプル入力
3
xkchen 90
zpl 100
zifeiy 60
サンプル出力
zpl 100
xkchen 90
zifeiy 60
トピック分析
ソートテンプレート構造の問題。
次のように構造が定義されています。
struct Student {
char name[22]; // 名字
int point; // 分数
} a[1001];
次のように比較関数が定義されています。
bool cmp(Student a, Student b) {
if (a.point != b.point) return a.point > b.point;
return strcmp(a.name, b.name) < 0;
}
しかし、我々は、文言の比較機能を簡素化することができ、以下のcmp
機能および上記の実現cmp
の機能に同じ機能を:
bool cmp(Student a, Student b) {
return a.point > b.point || a.point == b.point && strcmp(a.name, b.name) < 0;
}
説明:これはstrcmp
、辞書式に文字列(文字の配列によって表される)は、2つを比較するために使用され、文字列比較関数。
例えば、2つの文字列a
とb
次のとおりです。
- もし
a
辞書順よりもb
小さな、strcmp(a,b)
リターン-1
; - 場合
a
よりも辞書順b
大、strcmp(a,b)
返されます1
。 - 場合
a
とb
同じ文字列ですし、strcmp(a,b)
返します0
。
次のように完全なコードは次のとおりです。
#include <bits/stdc++.h>
using namespace std;
struct Student {
char name[22]; // 名字
int point; // 分数
} a[1001];
int n;
bool cmp(Student a, Student b) {
return a.point > b.point || a.point == b.point && strcmp(a.name, b.name) < 0;
}
int main() {
cin >> n;
for (int i = 0; i < n; i ++) cin >> a[i].name >> a[i].point;
sort(a, a+n, cmp);
for (int i = 0; i < n; i ++) cout << a[i].name << " " << a[i].point << endl;
return 0;
}
あなたが学んできた一方、string
私たちは、記述するために使用する名前を構築することができますname
セットの種類をstring
するので、string
変数の型が関係演算子が辞書式を比較する直接使用することができ、我々が使用する必要はありませんstrcmp
比較します辞書順の大きさ。
使用済みstring
のコードは、次のことを達成することを意味します。
#include <bits/stdc++.h>
using namespace std;
struct Student {
string name; // 名字
int point; // 分数
} a[1001];
int n;
bool cmp(Student a, Student b) {
return a.point > b.point || a.point == b.point && a.name < b.name;
}
int main() {
cin >> n;
for (int i = 0; i < n; i ++) cin >> a[i].name >> a[i].point;
sort(a, a+n, cmp);
for (int i = 0; i < n; i ++) cout << a[i].name << " " << a[i].point << endl;
return 0;
}