[]データ構造とアルゴリズムの研究ノート - 「アルゴリズム・ノート」-8

シーケンス

選択

ソート
最も一般的にはO(N-のハッシュねえ、高い複雑選択学習2
例:

挿入ソート

最も直感的な直接挿入ソートを学ぶ
例:

ソート機能の応用

C言語やC ++ライブラリ関数の推奨直接使用することは、書き込みコードへのソート機能でのqsort
ソート機能は、ヘッダ<アルゴリズム>であります
その使用は追加する必要があります

#include<algorithm>
using namespace std;

次のように関数の形式は次のとおりです。

sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填));

あなたは比較関数を記述していない場合は、デフォルトの範囲以前に行わ与えられました上昇
int型/フロート/ charデータ型や他の種類の注文することができる
。例:

#include <cstdio>
#include <algorithm>
using namespace std;


int main()
{
	int a[6] = { 9,4,2,5,6,-1 };//从小到大排序a[0]到a[3]
	sort(a, a + 4);
	for (int i = 0; i < 6; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	//从小到大排序a[0]到a[5]
	sort(a, a + 6);
	for (int i = 0; i < 6; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

比較関数CMPを実装する方法

オプションの第三パラメータがソート関数の比較関数(CMPを書き込む典型的関数)であり、人間のサイズと比較規則の種類比較匹敵する構造等との関係を開発する必要はありません。
学習基本データ型、構造の種類、書かれたカスタムを注文STLコンテナのCMPルール:

  1. アレイの基本データ型をソート
    CMPが記入されていない場合、デフォルトは大に小さくて、私は降順達成したい、あなたは要素のソート切り替えたときに「伝える」CMPを使用する必要がある
    例を:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

bool cmp(int a, int b) {
	return a > b;//理解为当a>b时把a放在b前面
}

int main()
{
	int a[6] = { 9,4,2,5,6,-1 };
	sort(a, a + 6,cmp);
	for (int i = 0; i < 6; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}
  1. 構造体の配列をソート
    それは次の構造を定義します。
struct node {
	int x, y;
}ssd[10];

1)。Aは、ソート
あなたがSSDアレイにしたい場合は、CMPの機能を記述することができ、Xを降順で並べ替え

bool cmp(node a, node b) {
	return a.x > b.x;//理解为当a>b时把a放在b前面
}

例:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

struct node {
	int x, y;
}ssd[10];

bool cmp(node a, node b) {
	return a.x > b.x;//理解为当a>b时把a放在b前面
}

int main()
{
	ssd[0].x = 2;
	ssd[0].y = 2;
	ssd[1].x = 1;
	ssd[1].y = 3;
	ssd[2].x = 3;
	ssd[2].y = 1;
	sort(ssd, ssd + 3,cmp);
	for (int i = 0; i < 3; i++)
	{
		printf("%d %d\n", ssd[i].x,ssd[i].y);
	}
	return 0;
}

出力:

3 1
2 2
1 3
请按任意键继续. . .

2)。二つのソート
X最初に従って降順、しかしときxが場合、Y-大小、次にセットCMPをINに等しいです。

bool cmp(node a, node b) {
	if (a.x != b.x)
		return a.x > b.x;
	else
		return a.y < b.y;
}

例:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

struct node {
	int x, y;
}ssd[10];

bool cmp(node a, node b) {
	if (a.x != b.x)
		return a.x > b.x;
	else
		return a.y < b.y;
}

int main()
{
	ssd[0].x = 2;
	ssd[0].y = 2;
	ssd[1].x = 1;
	ssd[1].y = 3;
	ssd[2].x = 2;
	ssd[2].y = 1;
	sort(ssd, ssd + 3,cmp);
	for (int i = 0; i < 3; i++)
	{
		printf("%d %d\n", ssd[i].x,ssd[i].y);
	}
	return 0;
}

出力:

2 1
2 2
1 3
请按任意键继续. . .
  1. ソートコンテナ
    STLで標準コンテナ、ベクターのみ、文字列、両端キューはの一種であります画像セットは、このような容器をマッピングするためですソート順を使用することを許可されていない、赤黒木を達成することである要素自体を命じました。
    ベクトルに例えば
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

struct node {
	int x, y;
}ssd[10];

bool cmp(int a, int b) {
	return a > b;//由于vector中的元素为int型,因此仍然是Int的比较
}

int main()
{
	vector<int> vi;
	vi.push_back(3);
	vi.push_back(1);
	vi.push_back(2);
	sort(vi.begin(), vi.end(), cmp);//对整个vector排序
	for (int i = 0; i < 3; i++)
	{
		printf("%d ", vi[i]);
	}
	return 0;
}

出力:

3 2 1 请按任意键继续. . .

文字列のソートを見て:

#include <cstdio>
#include <vector>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;

int main()
{
	string str[3] = { "bbbb","cc","aaa" };
	sort(str, str + 3);//将string型数组按字典序从小到大输出
	for (int i = 0; i < 3; i++)
	{
		//printf("%s \n",str[i]);//注意这里不能用printf,至于为什么,目前还不知道==
		cout << str[i] << endl;
	}
	return 0;
}

それは知られていない理由として、printf関数を使用することはできません注意
出力:

aaa
bbbb
cc
请按任意键继续. . .

あなたがのために、小から大まで交換したい場合

#include <cstdio>
#include <vector>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;

bool cmp(string str1,string str2) {
	return str1.length() < str2.length();
}

int main()
{
	string str[3] = { "bbbb","cc","aaa" };
	sort(str, str + 3,cmp);//将string型数组按字典序从小到大输出
	for (int i = 0; i < 3; i++)
	{
		//printf("%s \n",str[i]);//注意这里不能用printf,至于为什么,目前还不知道==
		cout << str[i] << endl;
	}
	return 0;
}

出力:

cc
aaa
bbbb
请按任意键继续. . .

学生は、ランキング達成します

学生の個々の順位ルール:別の異なるスコアランキング、同じですが、ランクに同じランクの割合を占めるが、ソート後の順位付け:(配列を計算するには2つの方法があります)

  1. 現在のスコアは、個々のランキング等しいランク上のスコア、またはランクに個々に等しい場合、配列インデックス+ 1に等しいです。
  2. タイトルが長い出力としてとして本当に、レコードランキングに持っていない場合:int型の変数rの初期値は1でみましょう個人が最初に個々の電流と現在の個々のスコアでない場合は、その後、すべての個人を横断し、最後の個別スコアに等しくありませんrが1だけインクリメントされる配列表に等しいです。このような行為は、あまりにも多くの情報の出力、長いコードの場合の第1の方法の結果を必要とするように適用されます。
    例:
    N-検査室、及びチケット番号を検査室に候補の各々の一部を与えられ、それは検査の検査室を降順にスコアによってすべての候補者を必要とし、順次、すべての候補者のチケット番号を出力し、ランク付け、およびランク番号。
#include <cstdio>
#include <vector>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;

struct student {
	long long  number;
	int score;
	int num;
	int rank0;
	int rank1;
}stu[100];

bool cmp(student a,student b) {
	if (a.score == b.score)
		return a.number < b.number;
	else
		return a.score > b.score;
}

//n个考场,给出各考场中考生的准考证号和分数,
//要求所有考生按分数从高到低排序,
//并按顺序输出所有考生的准考证号、排名、考场号以及考场内排名;

int main()
{
	int total = 0;//考场学生数
	int alltotal = 0;//学生总数
	int n;//考场数
	int k = 0;//学生数组号
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		int temp = k;
		scanf("%d", &total);
		for (int j = 0; j < total; j++)
		{
			scanf("%lld%d", &stu[k].number, &stu[k].score);
			stu[k].num = i + 1;
			k++;
		}
		alltotal += total;
		sort(stu + temp, stu + temp + total + 1, cmp);
		stu[temp].rank0 = 1;
		for (int j = temp+1; j < total+temp; j++)
		{
			if (stu[j].score == stu[j - 1].score)
			{
				stu[j].rank0 = stu[j - 1].rank0;
			}
			else
			{
				stu[j].rank0 = j-temp + 1;
			}
		}
	}
	printf("%d\n", alltotal);
	sort(stu, stu + alltotal+1,cmp);
	stu[0].rank1 = 1;
	printf("%lld %d %d %d\n", stu[0].number, stu[0].rank1, stu[0].num, stu[0].rank0);
	for (int j = 1; j < alltotal; j++)
	{
		if (stu[j].score == stu[j - 1].score)
		{
			stu[j].rank1 = stu[j - 1].rank1;
		}
		else
		{
			stu[j].rank1 = j + 1;
		}
		printf("%lld %d %d %d\n", stu[j].number, stu[j].rank1, stu[j].num, stu[j].rank0);
	}
	return 0;
}

入力:

2
5
8888001 95
8888005 100
8888003 95
8888002 77
8888004 85
4
8888013 65
8888011 25
8888014 100
8888012 85

輸出

2
5
8888001 95
8888005 100
8888003 95
8888002 77
8888004 85
4
8888013 65
8888011 25
8888014 100
8888012 85

教科書コード例:

#include <cstdio>
#include <vector>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;

struct student {
	char id[15];//准考证号
	int score;//分数
	int location_number;//考场号
	int location_rank;//考场内排名
}stu[100];

bool cmp(student a,student b) {
	if (a.score != b.score)
		return a.score > b.score;
	else
		return strcmp(a.id,b.id)<0;
}

//n个考场,给出各考场中考生的准考证号和分数,
//要求所有考生按分数从高到低排序,
//并按顺序输出所有考生的准考证号、排名、考场号以及考场内排名;

int main()
{
	int k, num = 0;//num为学生总数
	int n;//考场数
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &k);//该考场内人数
		for (int j = 0; j < k; j++)
		{
			scanf("%s%d", &stu[num].id, &stu[num].score);
			stu[num].location_number = i ;
			num++;
		}
		sort(stu + num-k, stu + num, cmp);
		stu[num-k].location_rank = 1;
		for (int j = num-k+1; j < num; j++)
		{
			if (stu[j].score == stu[j - 1].score)
			{
				stu[j].location_rank = stu[j - 1].location_rank;
			}
			else
			{
				stu[j].location_rank = j-(num-k) + 1;
			}
		}
	}
	printf("%d\n", num);
	sort(stu, stu + num,cmp);
	int r = 1;
	for (int j = 0; j < num; j++)
	{
		if (j>0&&stu[j].score != stu[j - 1].score)
		{
			r = j + 1;
			//stu[j].rank1 = stu[j - 1].rank1;
		}
		printf("%s %d %d %d\n", stu[j].id, r, stu[j].location_number, stu[j].location_rank);
	}
	return 0;
}

それを学ぶことができます:

  1. デザインのCMP機能、彼は数が文字の配列に設定されている知ったとき、それが設計する必要があります
    戻りのstrcmp(a.id、b.id)<0。
  2. 学生の総数は、ビット数がリアルタイムで各診察室の開始(この時間はあなたがすべてのこの試験の学生情報を入力仕上げ)マイナス検査室の学生の総数は、この時点での学生の総数のための最後の1に等しく、増加しています。
  3. 第2の方法は、以前のランキングを説明し、この用途では、私が以前に使用された最初の方法は、第二の方法は明らかに、より簡潔です。

エクササイズ

シーケンス

説明タイトル
ソート入力と出力の数nの。
入力
最初の入力ラインの整数Nは、(1 <= N <= 100)。次の行は、nは整数を含みます。
出力
データの各セットのためのテストデータの複数のセットであってもよく、nは整数で出力をソートし、各番号の後ろにスペースがあります。
行ごとのテストデータの各セット。

#include <cstdio>
#include <vector>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;

int main()
{
	int n;
	int input[110];
	while (scanf("%d", &n)!=EOF)
	{
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &input[i]);
		}
		sort(input, input + n);//这里到底要不要+1?
		for (int i = 0; i < n; i++)
		{
			printf("%d", input[i]);
			if (i != n)
			{
				printf(" ");
			}
		}
		printf("\n");
	}
	return 0;
}

問題があり、

	sort(input, input + n);

最後にまたはここにいない1?
ないプラス!入力は入力+ 0などとすることができるので、
入力としてポスト+(N-1)+1
特別注文

説明タイトルは
整数、前記ピックの最大数、およびソートの残り数の系列を入力してください。
入力
最初の行の入力はN、1 <= N <=整数含む 1000 の入力データの数を表します。
N個の整数の次の行。
出力は
、データのセットごとに、試験データの複数のセットであってもよい
、N個の整数の最大値を表す整数第一出力線、及び値は、アレイ、残りの種類の数から除去されます。
二行目の順序の出力。

#include <cstdio>
#include <vector>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;

int main()
{
	int n;
	int input[1100];
	while (scanf("%d", &n)!=EOF)
	{
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &input[i]);
		}
		if (n == 1)
		{
			printf("%d\n-1\n", input[0]);
		}
		else 
		{			
			sort(input, input + n);
			printf("%d\n", input[n - 1]);
			input[n - 1] = '\0';
			for (int i = 0; i < n - 1; i++)
			{
				printf("%d", input[i]);
				if (i < n-2)
				{
					printf(" ");
				}
			}
			printf("\n");
		}
	}
	return 0;
}

EXCELをソート

タイトル説明
Excelは、レコードのグループのいずれかによってソートする列を指定することができます。今、あなたは、同様の機能を実現するプログラムを書きます。
各テストケースのために、第一の出力線「ケースI:」私は試験番号である、(1から始まります)。その後、必要つまり、ソートの結果にN行を出力:C = 1は、学生番号を昇順に並べ替えたとき、場合C = 2、非減少辞書式順序付けの名前に応じて、場合C = 3、プレス性能非降順。場合は、同じ名前または同じ結果を持つ学生の数は、昇順で自分の学生番号を押してください。
入力
テスト入力すると、いくつかのテストケースが含まれています。最初のテストケースの各列は、2つの整数N(N <= 100000)、Nはレコード数であるCを含み、Cは、指定されたソートの列数です。ここではNライン、生徒のレコードを含む各です。学校の生徒数の各レコード(テスト学生数の無重複セットで6桁)、名前(せいぜい8とスペースなしていない文字列)、スコア(閉区間[1000]整数で)、各項目間のスペースで区切られました。N = 0は、入力端のすべてを読み取る場合、出力結果を対応しません。
出力
iは試験番号(1から始まる)があり、各テストケースのために、第一の出力線「ケースI」。その後、必要つまり、ソートの結果にN行を出力:C = 1は、学生番号を昇順に並べ替えたとき、場合C = 2、非減少辞書式順序付けの名前に応じて、場合C = 3、プレス性能非降順。場合は、同じ名前または同じ結果を持つ学生の数は、昇順で自分の学生番号を押してください。

#include <cstdio>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <iostream>
using namespace std;

struct student {
	char id[10];
	char name[10];
	int score;
}stu[100010];

bool cmp1(student a, student b)
{
	return strcmp(a.id, b.id)<0;
}

bool cmp2(student a, student b)
{
	if (!strcmp(a.name, b.name))
		return strcmp(a.id, b.id) < 0;
	else
		return strcmp(a.name, b.name) < 0;
}

bool cmp3(student a, student b)
{
	if (a.score != b.score)
		return a.score<b.score;
	else
		return strcmp(a.id, b.id)<0;
}

int main()
{
	int n,c;
	int nn = 1;
	while (scanf("%d%d", &n, &c), n)
	{
		for (int i = 0; i < n; i++)
		{
			scanf("%s%s%d", stu[i].id, stu[i].name, &stu[i].score);
		}
		switch (c)
		{
		case 1:
		{
			//sort(stu->id, (stu + n)->id);//结构体比较能不能这样偷懒?答:做梦。
			sort(stu, stu + n, cmp1);
			break;
		}
		case 2:
		{
			sort(stu, stu + n, cmp2);
			break;
		}
		case 3:
		{
			sort(stu, stu + n, cmp3);
			break;
		}
		default:
			break;
		}
		printf("Case %d:\n",nn);
		for (int i = 0; i < n; i++)
		{
			printf("%s %s %d\n", stu[i].id, stu[i].name, stu[i].score);
		}
		nn++;
	}
	return 0;
}

ケース1:
{
//ソート(stu-> ID、(STU + N) - > ID); //構造の比較はそれほど怠け者することはできませんか?回答:夢。
ソート(STU、STU + N、CMP1)。
ブレーク;
}

文字列内のソート

説明タイトルが
200以下の文字列を入力し、出力文字列は昇順にソートされます。
入力
テストデータセットの複数の入力文字列。
出力
入力、出力処理結果の各セットのために。

#include <cstdio>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <iostream>
using namespace std;
int main()
{
	char str[210];
	int len;
	while (fgets(str, 210, stdin) != NULL)
	{
		len = strlen(str);
		sort(str, str + len-1);
		str[len-1] = '\0';
		puts(str);
	}
	return 0;
}

フォーマットがされているので問題はACが(タイトルからクリアしない)、もはや問題はもつれすることはできません。
問題のB

タイトル説明
それぞれが降順に、最終的に順次、行、および主対角の要素の各列を求めると、m行m列(1 <M <10)が正方形で、そのプログラムを書きます出力。
入力
データの共通セットは、最初の入力は次の行mは、mは各列の行列要素の整数を表し、mは、正の整数に作用します。
出力
下降整数ライン構成は、各整数は、スペース、最後のラップが続きます。

#include <cstdio>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <iostream>
using namespace std;

bool cmp(int a, int b)
{
	return a > b;
}

int main()
{
	int num[10][10];
	int m;
	int sum[22];
	while (scanf("%d", &m) != EOF)
	{
		int sumi[10] = {}, sumj[10] = {}, sumx[2] = {};
		for (int i = 0; i < m; i++)
		{
			for (int j = 0; j < m; j++)
			{
				scanf("%d", &num[i][j]);
				sumi[i] += num[i][j];
				//if (j == m-1)
				//	getchar();
			}
		}
		for (int j = 0; j < m; j++)
		{
			for (int i = 0; i < m; i++)
				sumj[j] += num[i][j];
		}
		for (int x = 0; x < m; x++)
		{
			sumx[0] += num[x][x];
			sumx[1] += num[x][m - x - 1];
		}
		int p = 0;
		for (int i = 0; i < m; i++)
		{
			sum[p] = sumi[i];
			p++;
		}
		for (int j = 0; j < m; j++)
		{
			sum[p] = sumj[j];
			p++;
		}
		for (int x = 0; x < 2; x++)
		{
			sum[p] = sumx[x];
			p++;
		}
		sort(sum, sum + 2 * m + 2, cmp);
		for (int p = 0; p < 2 * m + 2; p++)
		{
			printf("%d", sum[p]);
			if (p != 2 * m + 1)
				printf(" ");
		}
		printf("\n");
	}
	return 0;
}

マウスキュー

説明タイトル
N白色マウス(= 100 1 <= N < )、 各ラットヘッドは、着色帽子でした。今ラットは、ラットの体重に応じて、各要求出力色その帽子ヘッド降順を秤量しました。帽子の色は、「赤」「青」、および他の文字列で表されます。別のマウスは、同じ色の帽子を着用することができます。整数としてマウスの体重。
入力
多入力の場合は、それぞれの場合の入力は、最初の整数N、マウスの数を行います。
ここでN行があり、各列は、ラットアルビノ情報です。最初は、100以下の正の整数である帽子ラットの色、せいぜい10文字の文字列を表す、ラットの体重、; 2番目の文字列を表します。
注意:ラットの重量が変化しました。
出力
降順マウスのマウスの体重に応じて、それぞれの場合の出力色キャップ。

#include <cstdio>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <iostream>
using namespace std;

struct mouse {
	int weight;
	char color[15];
}mou[110];

bool cmp(mouse a, mouse b)
{
	return a.weight > b.weight;
}

int main()
{
	int N;

	while (scanf("%d", &N) != EOF)
	{
		for (int i = 0; i < N; i++)
		{
			scanf("%d %s", &mou[i].weight, mou[i].color);//这里可不可以没有空格?
		}
		sort(mou, mou + N, cmp);
		for (int i = 0; i < N; i++)
		{
			printf("%s\n", mou[i].color);
		}
	}
	return 0;
}

以下のために(; I <N;整数iが0 = I ++)
{
scanf関数( "%D%s"は、&​​MOU [I] .weight、MOU [I] .color)。//ここにスペースを持っていないことはできますか?A:はい。
}

中位数

タイトル説明
定義中央値:データのセットを配列の昇順に、中間位置の数(又は平均最もつの中間データ)に
ランダムな整数の集合が与えられると、中央値が得られます数は、(浮動小数点使用せずに)、切り捨てることができ、ほとんどのうちの2つの数の平均必要に応じて
入力を
テストプログラムには、データの複数のセット、テストデータNの最初の行の各セット、テスト集合の代表を含みますデータの数が1 <= N <= 10000、含まれる 。
N行動N、N 0 =入力の終わりの、入力データ
出力の
出力ビット、テストデータ出力ラインの各セットを

#include <cstdio>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <iostream>
using namespace std;

int main()
{
	int n;
	int	num[10010];
	int temp;
	while (scanf("%d", &n), n)
	{
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &num[i]);
		}
		sort(num, num + n);
		if (n % 2)
			printf("%d\n", num[(n - 1) / 2]);
		else
		{
			temp = (num[n / 2] + num[n / 2 - 1])/2 ;
			printf("%d\n", temp);
		}
	}
}

パリティの整数ソート

説明タイトル
10の整数入力、スペースによって互いに分離。要求後に(スペースで区切られた)出力を並べ替える:
1.最初の大きい順に奇数、プレスの出力;
2及び前記偶数及びプレス昇順。
入力
10個の整数(0〜100)の任意の並べ替えを、空間によって互いに分離。
出力は、
空白で区切られたソート出力の要件に応じて、データの各セットのためのテストデータの複数のセットであってもよいです。
ヒント
複数のデータセット、出力形式に注意を払います
1.テストデータが多数のグループ、使用することができるが(CIN >> [0] >> [1] ... >> >> [9])同様のアプローチを達成します。
2.ランダム入力データは、おそらく等しいです。

#include <cstdio>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <iostream>
using namespace std;

bool cmp(int a, int b)
{
	return a > b;
}

int main()
{
	int a[10];//10还是11?
	int a0[10], a1[10];
	while (cin>> a[0] >> a[1] >> a[2] >> a[3] >> a[4] >> a[5] >> a[6] >> a[7] >> a[8] >> a[9])
	{
		int p = 0, q = 0;
		for (int i = 0; i < 10; i++)
		{
			if (a[i] % 2)
			{
				a1[p] = a[i];
				p++;
			}
			else
			{
				a0[q] = a[i];
				q++;
			}
		}
		sort(a1, a1 + p, cmp);
		sort(a0, a0 + q);
		for (int i = 0; i < p; i++)
			printf("%d ", a1[i]);
		for (int i = 0; i < q; i++)
		{
			printf("%d", a0[i]);
			if (i != q - 1)
				printf(" ");
		}
		printf("\n");
	}
	return 0;
}

**ランキング**

タイトル説明
がリアルタイムRanklistですが、唯一のトップは、各質問のスコアを考慮せずに、ソート完了までの問題の数に従ってランクが上の今日の検査は、それが最終順位ではありません。入場料を考えると、あなたは降順で、最終的な候補者によってスコア、およびそのパフォーマンスのプリントを見つけるためのプログラムを書きます。
入力
テスト入力フィールドには、試験の数に関する情報が含まれています。フィールド当たりの検査最初の情報線は候補N(0 <N <1000)の数を与え 、 試験の数M(0 <M <= 10 )、 スコアライン(正の整数)Gは、2行目の選別は、最初の質問に与えられます。 m個の質問の正の整数値を、N行、各行は、候補のチケット番号(文字列の長さが20を超えない)、総数M解決対象、タイトル、及び質問の数Mそれを与えられます(1からMまで被写体数)。
候補の数が0として読み取る場合、試験の入力端が処理されません。
出力
隙間によって分離されたスコアライン候補番号候補に出力降順にスコアによって、各試験のために、n個以上の分数出力の最初の行の最初の行の候補数、N行。同じオーバー候補のスコアかのように、その候補番号の昇順で出力。

#include <cstdio>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <iostream>
using namespace std;

struct student {
	char id[25];
	int n;
	int m[10];
	int score=0;//是不是这样初始化的?
}stu[1010];

bool cmp(student a, student b)
{
	if (a.score == b.score)
		return a.id < b.id;
	else
		return a.score > b.score;
}

int main()
{
	int N, M, G;
	int value[10] = {};
	int sum=0;
	student output[1000];
	while (scanf("%d%d%d", &N, &M, &G), N)
	{
		for (int i = 0; i < M; i++)
		{
			scanf("%d", &value[i]);
		}
		for (int i = 0; i < N; i++)
		{
			scanf("%s%d", stu[i].id,&stu[i].n);
			for (int j = 0; j < stu[i].n; j++)
			{
				scanf("%d", &stu[i].m[j]);
				stu[i].score += value[stu[i].m[j]-1];
			}
		}
		for (int i = 0; i < N; i++)
		{
			if (stu[i].score >= G)
			{
				output[sum] = stu[i];//能不能直接复制?
				sum++;
			}
		}
		sort(output, output + sum, cmp);
		printf("%d\n", sum);
		for (int i = 0; i < sum; i++)
		{
			printf("%s %d\n", output[i].id, output[i].score);
		}
	}
	return 0;
}
公開された43元の記事 ウォンの賞賛4 ビュー1219

おすすめ

転載: blog.csdn.net/weixin_42176221/article/details/100998916