問題の分類5分類結果の入門演習ソリューション

マシン演習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つの文字列ab次のとおりです。

  • もしa辞書順よりもb小さな、strcmp(a,b)リターン-1;
  • 場合aよりも辞書順b大、strcmp(a,b)返されます1
  • 場合ab同じ文字列ですし、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;
}

おすすめ

転載: www.cnblogs.com/zifeiynoip/p/11450507.html