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

(3N + 1)の推測の殺害魅力

#include "stdafx.h"
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

int main()
{
	int n;
	int i = 0;
	scanf("%d", &n);
	while (n - 1)
	{
		if (fmod(n, 2))
		{
			n = 3*n + 1;
		}
		n = n / 2;
		i++;
	}
	printf("%d", i);
	return 0;
}

この状態にある間に変更することができるが(N = 1。!)
FMOD関数は%に変更できます。if(N%2 == 0)

ショベル強いどの

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

int main()
{
	int n,m=0,maxnum=0,maxscore=0,score;
	int a[1000] = { 0 };
	int b[1000] = { 0 };
	scanf("%d", &n);
	for(int i=0;i<n;i++)
	{
		scanf("%d %d", &a[i], &score);
		b[a[i]] += score;
		if (a[i] > m)	m = a[i];
	}
	for (int i = 0; i < m; i++)
	{
		if (b[i] > maxscore)
		{
			maxscore = b[i];
			maxnum = i;
		}
	}
	printf("%d %d", maxnum, maxscore);
	return 0;
}

ここでは、被写体が要求されるN <100000であるが、これは、1000年にデータのオーバーフロー、プログラムの正常な動作の原因となります明らかに質問の意味を満たしていない、[100000]の初期化を置く唯一の配列bを初期化したまま、削除。

**练习**

ツリーの残りの部分

説明タイトルが
整数L(1 <= L <=の長さを有する 10000) 道路の、一方はラインセグメントの長手方向軸Lの数を想像することができ、開始点は座標原点、すべての整数でツリー、すなわち、座標点である0 、1,2、...、L合計L + L + 1は、ツリー上の位置を有します。
今いくつかの木を除去するために、ツリー除去部は、次のような100〜200は、全てのツリー(含む)100-200から除去表し、数字の組で表されます。
M(1 <= M <=が存在してもよい 100) の間隔、間隔の間にオーバーラップしてもよいです。今、ツリーのすべてのセクションの要件を除去した後に残る木の数。

入力二つの整数のL(1 <= L <= 10000) 及びM(1 <= M <= 100)。
次に、整数Mのグループは、各番号の組と、があります。

出力は、入力データ、各入力データの複数のセットであってもよいし、ツリーのすべてのセクションを除去した後、残りの木の数を表す数値を出力します。

#include <cstdio>
#include <cstring>
#include<cmath>

int main()
{
	int L, M,q,p;
	int a[10001] = { 0 };
	while (scanf("%d %d", &L, &M), L || M)
	{
		int sum = 0;
		//memset(a, 0, sizeof(a));
		for (int i = 0; i <= L; i++)
		{
			a[i] = 1;
		}
		while (M--)
		{
			scanf("%d %d", &q, &p);
			for (int j = q; j <= p; j++)
			{
				a[j] = 0;
			}
		}
		for (int i = 0; i <= L; i++)
		{
			sum += a[i];
		}
		printf("%d\n", sum);
	}
	return 0;
}

A + B

タイトル説明
である二つの整数AとB、与えられる:ビットから出発し、カンマで3桁はそれぞれ「」分離されました。くださいA + Bの計算、および正規形を出力します。
入力データは、複数組の、ラインごとのデータの各セットを含む
二つの整数AとB(-10からなる。9 <A、B <10 。9)。
A + Bの出力結果を計算し、その正規形、ライン毎のデータのそれぞれのセットを出力します。

ああああああああありません!

特別な乗算

タイトル説明
書き込みアルゴリズム、10億2小さな、検索結果への入力。
特別な乗算例:123 * 45 = 1 4 + 1 5 + 2 4 + 2 5 + 3 4 + 3 5
入力
二つの数未満百億より
出力
入力は、データのセットごとに、入力の出力データの複数のセットを有していてもよいです二つの数は、対象の要件に従って計算方法の後に得られた結果。

// ConsoleApplication1.cpp: 定义控制台-应用程序的入口点。
//
#include "stdafx.h"
#include <cstdio>
#include <cstring>
#include <cmath>

int main()
{
	int a[10] = { 0 }, b[10] = { 0 };
	long long int num1, num2;
	long temp;
	while (scanf("%lld %lld", &num1, &num2) != EOF)
	{
		for (int i = 0; i<10; i++)
		{
			temp = fmod(num1, pow(10, i + 1));
			a[i] = (temp - fmod(temp, pow(10, i))) / (pow(10, i));
			temp = fmod(num2, pow(10, i + 1));
			b[i] = (temp - fmod(temp, pow(10, i))) / (pow(10, i));
		}
		int result = 0;
		for (int i = 0; i<10; i++)
		{
			for (int j = 0; j<10; j++)
			{
				result += a[i] * b[j];
			}
		}
		printf("%d\n", result);
	}
	return 0;
}

時間の問題を解決するには、そのようなint型の範囲/ long int型などいくつかの問題、それはとても時間のデータ型は、長い長いint型を設定する必要があります設定された最大数999999999を、含まれていませんが発生しました。

質問:この質問は、他の解決策はありますか?例えば、文字列?

#include <cstdio>
#include <cstring>
#include <cmath>

int main()
{
	char a[10] = { 0 }, b[10] = { 0 };
	int result = 0;
	int m, n;
	while (scanf("%s %s", a, b) != EOF)
	{
		for (int i = 0; i<strlen(a); i++)
		{
			for (int j = 0; j<strlen(b); j++)
			{
				m = a[i] - '0';
				n = b[j] - '0';
				result +=( a[i]-'0') *( b[j]-'0');
			}
		}
		printf("%d\n", result);
	}
}

注点である上記のコードを書くために他の描画方法

		for (int i = 0; i<strlen(a); i++)

直接書かれたコードのこの行、もし私<10;原因は読ん推測「\ 0」、そう誤差の最終結果という。

奇数 - 偶数の数を比較

説明タイトルは
、最初の行の番号を入力し、nは、第二の入力ラインの数nここで数N、一層NOへの出力、奇数の場合よりも、出力YES。
入力し
たデータの入力複数のセットを。
各入力nと入力nは整数(1 <= N <= 1000 )。
出力
NO、出力YESに奇数、偶数出力以上の場合。

#include <cstdio>
#include <cstring>
#include <cmath>

int main()
{
	int n,num;
	while (scanf("%d", &n) != EOF)
	{
		int n1 = 0, n2 = 0;
		while (n--)
		{
			scanf("%d", &num);
			if (fmod(num, 2))	n1++;
			else n2++;
		}
		if (n2 > n1)	printf("NO\n");
		else printf("YES\n");
	}
	return 0;
}

最短距離

题目描述
タスクは本当に簡単です。シンプルサイクルを形成し、高速道路上のNが終了与え、あなたは出口の任意のペア間の最短距離を伝えることになっている
输入
各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、距離Diは、i番目と第(i + 1)-st出口との間の距離であるD1 D2 ... DN、整数Nが続く、N整数([3、105]内)が含まれ、およびDNはN番目と第一の出口との間にあります。行のすべての数字は、スペースで区切られます。Mラインが終了は、総往復距離がそれ以上であることが保証されていない1からNに番号が付けられていることを条件として、各々が出口番号の対を含み、従うと2行目は、M(<= 104)の整数陽性を与えます107より
输出
各テストケースのために、各々が出口の対応する所与の対の間の最短距離を含み、M株で検索結果を印刷する。
样例输入

#include <cstdio>
#include <cstring>
#include <cmath>
#define N 200000
#define M 10000
using namespace std;

int main()
{
	int n,num;
	int a[N] = { 0 }, p[M] = { 0 }, q[M] = { 0 };
	int lentha, lenthpq;
	while (scanf("%d", &n) != EOF)
	{
		int i = 0;
		while (n-i)
		{
			scanf("%d", &a[i]);
			i++;
		}
		int row;
		scanf("%d", &row);
		int j = 0;
		while (row-j)
		{
			scanf("%d %d", &p[j], &q[j]);
			if (p[j] > q[j])
			{
				int temp;
				temp = p[j];
				p[j] = q[j];
				q[j] = temp;
			}
			j++;
		}
		for (int k = 0; k < n; k++)
		{
			a[k + n] = a[k];
		}
		for (int k = 0; k < row; k++)
		{
			int dis1=0, dis2=0;
			for (int u = p[k]-1; u <=q[k]-2 ; u++)
			{
				dis1 += a[u];
			}
			for (int u = q[k] - 1; u <= p[k] + n - 2;u++)
			{
				dis2 += a[u];
			}
			if (dis1 < dis2)	printf("%d\n", dis1);
			else printf("%d\n", dis2);
		}
	}
	return 0;
}

A + B及びC

主題記述
三つの整数A、B及びCにおける所定の区間[-231、231]は、A + Bは、その要求がCよりも大きいか否かを判定する
入力
入力ライン1は、Tの整数正(<= 10)、テストケースの数を与えます。Tは、その後、各行ごとに、順序がA、B及びCの与えられ、テストケースのセットを与えられています 整数の間のスペースで区切られています。
出力
各テストケースのために、ラインに出力「ケース#X:真」A + B> Cであれば、そうでなければ「ケース#X:偽」を出力、X(1から始まる)テストケース番号です。

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

int main()
{
	int n;
	long long a, b, c,result;
	scanf("%d", &n);
	for (int i = 0; i<n; i++)
	{
		scanf("%lld %lld %lld", &a, &b, &c);
		result = a + b - c;
		if (result > 0)	printf("Case #%d: true\n", i + 1);
		else
			printf("Case #%d: false\n", i + 1);
	}
	return 0;
}

パートA + B **

説明タイトル
タイトル記載
PA Aの整数はその全てのDAを新たなように、正整数A、「DA(整数として)の部分は、」定義されています。例えば:考えるA = 3862767、DA = 6、2 A 6があるので、次に、 "セクション6" PA 66 Aが、です。
今、PA + PBを計算するプログラムを書き、A、DA、B、DBを与えられました。
入力
列Aに順次与えられた入力、DA、B、DBは、0 <A、B <1010中間領域によって分離しました。
出力
の出力値PA + PB行インチ

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

int num(int a, int da)
{
	int numa = 0;
	for (int i = 1; i < 10; i++)
	{
		int k, t;
		k = pow(10, i);
		t = pow(10, i - 1);
		int m;
		m = (fmod(a, k) - fmod(a, t)) / t;
		if (m == da) 
		{
			numa++;
		}
	}
	return numa;
}

int compute(int numa,int da)
{
	int pa = 0;
	for (int i = 0; i < numa; i++)
	{
		pa += da * pow(10, i);
	}
	return pa;
}

int main()
{
	int a, b;
	int pa=0, pb=0,da,db;
	int numa = 0, numb = 0;
	while (scanf("%d %d %d %d", &a, &da, &b, &db) != EOF)
	{
		numa=num(a, da);
		numb=num(b, db);
		pa = compute(numa, da);
		pb = compute(numb, db);
		printf("%d\n", pa + pb);
	}
	return 0;
}

** **ハンマーはさみ布

  • 出会いの問題は明らかに同じことを答える==何が悪かったのか分かりません!

タイトル説明
誰もが「ハンマーとはさみ」のゲームをプレイすることができる必要があります:彼らの両方所与のジェスチャー、示されるように、ルールの結果:
今、与えられた2人の男が、レコード、両方の勝利、フラット、負の数の統計を衝突し、双方は勝利のどのようなジェスチャー最大のチャンスを与えられました。
入力
入力ライン1、すなわちN(<= 105)、整数正の両対立の数を与えます。次いで、N行、各行は、すなわち、同時にジェスチャーとB側が与えられ、情報対立を与えます。Cは、「ハンマー」を表す代表J「はさみ」、Bは「布」を表し、最初の文字は第二者に代わって、パーティを表し、中間スペースがあります。
出力
出力1及び2は、インターデジタルスペースで区切られた、線A、Bの勝利、平坦な、負の値を与えられています。ライン3に示す2つの文字はA、Bは、ジェスチャの最大数を獲得し、中間スペースがある表します。解決策は、アルファベット順に出力最小ソリューション一意でない場合。

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

int main()
{
	int n;
	char jia, yi;
	int a[2][6] = { 0 };
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		getchar();
		scanf("%c %c", &jia, &yi);
		if (jia == 'C')
		{
			if (yi == 'J')
			{
				a[0][0]++;
				a[0][3]++;
				a[1][2]++;
			}
			if (yi == 'B')
			{
				a[0][2]++;
				a[1][0]++;
				a[1][4]++;
			}
			if (yi == 'C')
			{
				a[0][1]++;
				a[1][1]++;
			}
		}
		if (jia == 'J')
		{
			if (yi == 'B')
			{
				a[0][0]++;
				a[0][5]++;
				a[1][2]++;
			}
			if (yi == 'C')
			{
				a[0][2]++;
				a[1][0]++;
				a[1][3]++;
			}
			if (yi == 'J')
			{
				a[0][1]++;
				a[1][1]++;
			}
		}
		if (jia == 'B')
		{
			if (yi == 'C')
			{
				a[0][0]++;
				a[0][4]++;
				a[1][2]++;
			}
			if (yi == 'J')
			{
				a[0][2]++;
				a[1][0]++;
				a[1][5]++;
			}
			if (yi == 'B')
			{
				a[0][1]++;
				a[1][1]++;
			}
		}
		int cha = 1;
	}
	printf("%d %d %d\n%d %d %d", a[0][0], a[0][1], a[0][2], a[1][0], a[1][1], a[1][2]);
	int output[2][2] = { 0 };
	for (int man = 0; man < 2; man++)
	{
		for (int q = 3; q <=5 ; q++)
		{
			if (a[man][q] > output[man][1])
			{
				output[man][1] = a[man][q];
				output[man][0] = q;
			}
		}
	}
	printf("\n");
	for (int k = 0;  k< 2; k++)
	{
		switch (output[k][0])
		{
		case 3: {
			printf("C ");
			break;
		}
		case 4: {
			printf("B ");
			break;
		}
		case 5: {
			printf("J");
			break;
		}
		default:
			break;
		}
		if (k == 1)
			printf("\n");
	}
	return 0;
}
公開された43元の記事 ウォンの賞賛4 ビュー1221

おすすめ

転載: blog.csdn.net/weixin_42176221/article/details/100733833
おすすめ