「アルゴリズムノート」学習日記-6.8の一般的な使用法の詳細と6.9のアルゴリズムヘッダーファイルの一般的に使用される関数

6.8ペアの一般的な使用法の詳細な説明

コードアップコンテストID:100000603

質問A:重心はどこですか

タイトルの説明
誰もがニュートンの重力の発見の物語を知っています。ニュートンが重力を発見して以来、人々は重力の理論で多くの問題を解決してきました。それだけでなく、各オブジェクトには独自の重心があることもわかっています。
さて、三角形の3つの頂点の座標がわかったら、三角形の重心を計算できますか?
入力
問題には、複数のテストデータセットが含まれています。最初の行にテストデータの数を示す正の整数nを入力します。n= 0の場合、入力は終了します。
次のn行には、各行に6つの数値x1、y1、x2、y2、x3、y3が含まれ、三角形の3つの頂点の座標を表します。
出力
各入力セットについて、重心の座標が出力され、結果は小数点第1位を保持します。
入力例

2
1.0 2.0 3.0 4.0 5.0 2.0
1.0 1.0 4.0 1.0 1.0 5.0
0

出力例

3.0 2.7
2.0 2.3

アイデアは
比較的単純です。3つのペアコンテナーp1、p2、p3を定義して各ポイントの情報を格納し、重心座標はx =(x1 + x2 + x3)/ 3、y =(y1 + y2 + y3 )/ 3。
コード

#include<cstdio>
#include<string.h>
#include<algorithm>
#include<string>
#include<utility>
#include<iostream>
using namespace std;
int main(){
	int n;
	while(scanf("%d", &n) != EOF){
		if(n==0) break;
		for(int i=0;i<n;i++){
			pair<double, double> p1, p2, p3;
			double x1, y1, x2, y2, x3, y3;
			scanf("%lf%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &x3, &y3);
			p1 = make_pair(x1, y1);
			p2 = make_pair(x2, y2);
			p3 = make_pair(x3, y3);
			double x, y;
			x = (p1.first+p2.first+p3.first)/3;
			y = (p1.second+p2.second+p3.second)/3;
			printf("%.1f %.1f\n", x, y);
		}
	}
	return 0;
}

まとめ

一般にペアは2つの要素を含む構造体とみなすことができ、要素の呼び出し方法は構造体と同じでクリックするだけで直接呼び出せます。 ++ 11にはタプルtupleがあります。同様に、前回提供されたC ++リファレンス(
<tuple> -C ++ Referenceの
使用法とペアは少し異なります)で見つけることができます。構造hhhh。

6.9アルゴリズムヘッダーファイルの共通関数

コードアップコンテストID:100000604

問題A:最大数と最小数を見つける

トピックの説明
最初にNを入力して数値の数を示し、次にNの数値を入力してこれらのNの数値の最大値と最小値を見つけます。N <= 10000、入力の絶対値以上10 。6
サンプル入力

4  
2 0 1 2

出力例

2 0

アイデア
この質問も比較的単純ですが、執筆の過程で、N = 1とN = 2の2つのケースについて特別な判断を行う必要があります。
N≥3の場合、最初にmax()とmin()を使用して最初の2つの数値の最大値と最小値を計算し、次にmax()とmin()を少しずつ使用して比較します。
コード

#include<cstdio>
#include<string.h>
#include<algorithm>
#include<string>
#include<iostream>
using namespace std;
const int maxn = 10000;
int a[maxn] = {0};
int main(){
	int N;
	while(scanf("%d", &N) != EOF){
		for(int i=0;i<N;i++) scanf("%d", &a[i]);
		if(N==1) printf("%d %d\n", a[0], a[0]);
		else{
			int MaxNumber = max(a[0], a[1]);
			int MinNumber = min(a[0], a[1]);
			if(N==2) printf("%d %d\n", MaxNumber, MinNumber);
			else{
				for(int i=2;i<N;i++){
					MaxNumber = max(MaxNumber, a[i]);
					MinNumber = min(MinNumber, a[i]);
				}
				printf("%d %d\n", MaxNumber, MinNumber);
			}	
		}
		memset(a, 0, sizeof(a));
	}
	return 0;
}

質問B:完全な手配

タイトル説明
異なる小文字で構成される文字列を指定して、この文字列のすべての順列を出力します。
小文字の場合、 'a' <'b' <…<'y' <'z'があり、指定された文字列の文字は小さいものから大きいものの順に配置されていると想定します。
入力
入力は1行のみで、異なる小文字で構成される文字列であり、文字列の長さは1〜6であることがわかっています。
出力
この文字列のすべての配置を1行に1つずつ出力します。アルファベット順に並べる必要があります。アルファベット順は次のように定義されます
。S= s1s2…sk、T = t1t2…tkが与えられた場合、S <Tはp(1 <= p <= k)の存在と同等であり、
s1 = t1、s2 = t2、…、 sp-1 = tp-1、sp <tpが確立されます。
サンプル出力の各グループの後には空白行が続くことに注意してください。
入力例

xyz

出力例

xyz
xzy
yxz
yzx
zxy
zyx

ヒント
STLでnext_permutationを使用するのは非常に簡潔です。
アイデア
本が同じである限り、next_permutation()関数をdo ... whileの形式で使用します(文字列にイテレータが使用されている場合、括弧内の2つのパラメータはbegin()とend()です)。さらに、ヘッダーファイルには、全配列の最後のシーケンスを返すnext_permutation()に加えてprev_permutation()があります。
この質問では、サンプル出力の後に空白行が必要になるため、フォーマットエラーが発生しやすくなります。
コード

#include<cstdio>
#include<string.h>
#include<algorithm>
#include<string>
#include<iostream>
using namespace std;
int main(){
	string tmp;
	while(getline(cin, tmp)){
		do{
			cout<<tmp<<endl;
		}while(next_permutation(tmp.begin(), tmp.end()));
		cout<<endl;
	}
	return 0;
}

質問C:配列反転

タイトル説明
長さが200以下の文字列を入力し、配列を逆に出力します。
入力
テストデータには複数のセットがあり、それぞれが文字列を入力します。
出力
各入力セットについて、反転した結果を出力してください。
入力例

tianqin

出力例

niqnait

ヒント
入力した文字列にはスペースが含まれる場合があることに注意してください。
アイデア
この質問は難しくありません。単にreverse()関数を使用してください。文字列のパラメータにはイテレータを入力する必要があることに注意してください。
コード

#include<cstdio>
#include<string.h>
#include<algorithm>
#include<string>
#include<iostream>
using namespace std;
int main(){
	string tmp;
	while(getline(cin, tmp)){
		reverse(tmp.begin(), tmp.end());
		cout<<tmp<<endl;
	}
	return 0;
}

まとめ

<algorithm>実際には、ヘッダーファイルには、2つのポインターセクションなど、merge()、partition()、binary_search、lower_bound()、upper_bound()などの多くの関数があります。すでに<algorithm>で記述されているので、必要なときに呼び出してください。
興味のある学生は、C ++リファレンスの<algorithm>でさらに多くの関数を表示し続けることができ、宝物→_→を見つけることができます。

元の記事を54件公開 27 件を獲得 4983件を表示

おすすめ

転載: blog.csdn.net/weixin_42257812/article/details/105348908