基本的なアルゴリズムトレーニング:まだレベルBをパットしています(25ポイントが完了しています!AK!)

質問1:1070ノット(25ポイント)

ここに画像の説明を挿入

私のACコード:この質問は小さなトップヒープを解決しません

#include <iostream>
#include <queue>
#include <cmath>
using namespace std;

priority_queue<double, vector<double>, greater<double> > q;
int main() {
    
    
	int n;
	cin >> n;
	while (n--) {
    
    
		double a;
		cin >> a;
		q.push(a);
	}
	while (1 < (int)q.size()) {
    
    
		double f = q.top(); q.pop();
		double s = q.top(); q.pop();
		double Next = f / 2.0 + s / 2.0;
		q.push(Next);
	}
	cout << floor(q.top());
	return 0;
}

質問2:1065の単一の犬(25ポイント)

ここに画像の説明を挿入

私のACコード:ゲストの注文がない場合、*(ans.begin()-1)が不正にアクセスされることに注意してください!これは、2番目のテストポイントでの「セグメント障害」が原因です。

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <map>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;

const int maxn = 10005;
map<int, int> mp;
int n, m, a[maxn], b[maxn];
vector<int> ans;
int main() {
    
    
	scanf("%d", &n);
	while (n--) {
    
    
		int a, b;
		scanf("%d %d", &a, &b);
		mp[a] = b;
		mp[b] = a;
	}
	scanf("%d", &m);
	fill(a, a + m, -1);
	fill(b, b + m, -1);
	for (int i = 0; i < m; ++i) {
    
    
		scanf("%d", &a[i]);
		b[i] = a[i];
	}
	sort(b, b + m);
	for (int i = 0; i < m; ++i) {
    
    
		if (mp.find(a[i]) == mp.end())
			ans.push_back(a[i]);
		else if (!binary_search(b, b + m, mp[a[i]]))
			ans.push_back(a[i]);
	}
	printf("%d\n", (int)ans.size());
	if ((int)ans.size() > 0) {
    
    
		sort(ans.begin(), ans.end());
		for (vector<int>::iterator it = ans.begin(); ans.end() - 1 != it; ++it)
			printf("%05d ", *it);
		printf("%05d", ans[(int)ans.size() - 1]);
	}
	return 0;
}

3番目の質問:1050スパイラルマトリックス(25ポイント)

ここに画像の説明を挿入

私のACコード:以前C ++の期末試験にサインインしていたことを覚えておく必要があると思います。そのとき、私は恥ずかしく、さらには恥ずかしく、嫌いでさえサインインに失敗しました。

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;

bool cmp(int a, int b) {
    
     return a > b; }
int main() {
    
    
	int n, a, r, c;
	vector<int> Vec;
	scanf("%d", &n);
	for (int i = 0; i < n; ++i) {
    
    
		scanf("%d", &a);
		Vec.push_back(a);
	}
	for (int i = (int)sqrt(n); i >= 1; --i) 
		if (!(n % i)) 
		{
    
    
			c = i, r = n / i;
			break;
		}
	sort(Vec.begin(), Vec.end(), cmp);
	int** ans = new int* [r];
	for (int i = 0; i < r; ++i)
		ans[i] = new int[c];
	int i = 0, j = 0, Row1 = 0, Row2 = r - 1, Col1 = 0, Col2 = c - 1;
	while (i < n) {
    
    
		if (!(j & 1)) {
    
    
			if (0 == j % 2 && 0 == j % 4) {
    
    
				for (int p = Col1; p <= Col2; ++p, ++i)
					ans[Row1][p] = Vec[i];
				j++;
				Row1++;
			}
			else {
    
    
				for (int p = Col2; p >= Col1; --p, ++i)
					ans[Row2][p] = Vec[i];
				j++;
				Row2--;
			}
		}
		else {
    
    
			if (1 == j % 2 && 1 == j % 4) {
    
    
				for (int p = Row1; p <= Row2; ++p, ++i)
					ans[p][Col2] = Vec[i];
				Col2--;
				j++;
			}
			else {
    
    
				for (int p = Row2; p >= Row1; --p, ++i)
					ans[p][Col1] = Vec[i];
				Col1++;
				j++;
			}
		}
	}
	for (int i = 0; i < r; ++i) {
    
    
		for (int j = 0; j < c; ++j) {
    
    
			if (j < c - 1)
				printf("%d ", ans[i][j]);
			else
				printf("%d", ans[i][j]);
		}
		printf("\n");
	}
	return 0;
}

4番目の質問:1045クイックソート(25ポイント)

ここに画像の説明を挿入

私のACコード:この質問のアイデアについて話します。

最初は単純すぎると思いました。別の配列b []を使用して元の配列a []をコピーし、配列b []をソートします。順序付けされた状態の要素の順序が元の配列の順序と同じである場合、元の配列の要素がすでに配置されていることを示します。後でテストケースを作成しました:
5
5 4 3 2 1

合理的には0を出力するはずですが、結果は次のとおりです:
1
3
理由は次のとおりです:
並べ替え後配列:1 2 3 4 5
元の状態配列:5 4 3 2 1
ご覧のとおり、この3は配置されているようですが、配置されていません。これは適切な位置にあるはずです。この逆の秩序立った状態はプログラムを誤動作させる原因になります!この問題を解決するには?最初は非常にブレインストーミングでしたが、Liu Ruのブログを読んで、1点逃してしまったことに気づきました。順序の場合、i番目の要素は最初のi要素の中で最大の要素でなければなりません!逆順の場合は、最小の要素であり、逆順と区別されます。このバグは、すべての要素が完全に逆にされたときに発生するだけではないことに注意してください!連続した間隔が完全に逆転している限り、この種のバグが発生します!

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

const int maxn = 1e5 + 5;
int n, a[maxn], b[maxn], preMax[maxn];
vector<int> ans;
int main() {
    
    
	cin >> n;
	for (int i = 1; i <= n; ++i) {
    
    
		cin >> a[i];
		b[i] = a[i];
	}
	preMax[1] = a[1];
	for (int i = 2; i <= n; ++i) {
    
    
		if (a[i] > preMax[i - 1])
			preMax[i] = a[i];
		else
			preMax[i] = preMax[i - 1];
	}
	sort(b + 1, b + n + 1);
	for (int i = 1; i <= n; ++i)
		if (b[i] == a[i] && preMax[i] == a[i])
			ans.push_back(a[i]);
	cout << ans.size() << endl;
	if ((int)ans.size() > 0) {
    
    
		for (int i = 0; i < (int)ans.size() - 1; ++i)
			cout << ans[i] << ' ';
		cout << ans[(int)ans.size() - 1];
	}
	cout << endl;
	return 0;
}

おすすめ

転載: blog.csdn.net/qq_44274276/article/details/105244109