Codeforcesラウンド#632(本部2)問題への解決策の一部

Codeforcesラウンド#632(本部2)

A.リトルアルテム

質問の意味:少し。

分析:このイメージの構築:

BWW...W
BWW...W
BBB...B
#include <bits/stdc++.h>
using namespace std;
void io() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); }

int main() {
	io(); int t;
	cin >> t;
	while (t--) {
		int n, m;
		cin >> n >> m;
		for (int i = 1; i < n; ++i) {
			cout << "B";
			for (int j = 1; j < m; ++j) cout << "W";
			cout << "\n";
		}
		for (int i = 1; i <= m; ++i) cout << "B";
		cout << "\n";
	}
}

B.種類アントン

問題の意味:配列\(A_N \) A (\ \ - \ {1,0,1 \})の要素を構成し、配列の任意の要素を使用することができる(a_j \)\で置換されている\(a_j + a_iを(J> I)\) 動作はアレイ求め、任意の回数行うことができる)\(A_Nは\によって配列に変換することができる\(B_N \)

分析:もし\(a_j <b_j \) そこでなければなりません\(= a_iを1(I <J)\。) ;もし\(a_j> b_j \) そこでなければなりません\(a_iを= -1(I < J) \) 。 そして、特別審査員\(J = 1 \)

#include <bits/stdc++.h>
using namespace std;
void io() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); }

int main() {
	io(); int t;
	cin >> t;
	while (t--) {
		int n; cin >> n;
		vector<int> a(n), b(n);
		vector<vector<int> > vis(n, vector<int>(2));
		for (auto& i : a) cin >> i;
		bool f1, f2; f1 = f2 = false;
		int cnt = 0;
		for (auto i : a) {
			if (i < 0) f1 = true;
			if (i > 0) f2 = true;
			vis[cnt][0] = f1;
			vis[cnt++][1] = f2;
		}
		for (auto& i : b) cin >> i;
		bool f = true;
		if (a[0] != b[0]) f = false;
		for (int i = 1; i < n; ++i) {
			if (b[i] > a[i] && !vis[i - 1][1]) {
				f = false;
				break;
			}
			if (b[i] < a[i] && !vis[i - 1][0]) {
				f = false;
				break;
			}
		}
		cout << (f ? "YES\n" : "NO\n");
	}
}

C.ユージーンアレイ

質問の意味統計配列:\(A_N \) いくつかの連続したシーケンス満足がありますされるシーケンスが存在しないと(\ 0)が\連続したシーケンスです。

分析:統計とに回す(0 \)\差し引き、その後、順番に。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
void io() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); }
map<ll, ll> MP;

int main() {
	io(); int n;
	cin >> n;
	MP[0] = 0;
	ll r = -1, cur = 0, ans = 0;
	for (int i = 1; i <= n; ++i) {
		ll x; cin >> x;
		cur += x;
		if (MP.count(cur)) r = max(r, MP[cur]);
		ans += r + 1;
		MP[cur] = i;
	}
	ans = (n + 1ll) * n / 2 - ans;
	cout << ans;
}

学校でのD.課題№41

問題の意味の長さを考える:\(N- \)文字とすることにより(L、R \)\文字列、各ラン、あなたが隣接の任意のペアを選択することができます\(RL \)を、どのなる(LR \)\、によってかどうかだけ求め\(K \)文字列の周り(L \)\すべての左側に移動し、\(R&LT \)右側にあるすべての移動。

分析:各ラウンド演算我々はすべての為替スワップ位置にできることは貪欲され、統計が(と呼ばれる為替完了するまでに、少なくともいくつかのラウンドを必要とする(CNT \)を\)、および取引所の合計数を(カウントと呼ばれる(合計\ \ ))、もし中(K \ [CNT、\ )の和] \ 我々は運転のラウンドでに分割することができるように開放することができるので、あなたは、交換プログラムを与えることができます(合計\)\ラウンド。

#include <bits/stdc++.h>
#define SIZE 3010
#define ll long long
using namespace std;
void io() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); }
vector<int> vec[SIZE];
char s[SIZE];
 
int main() {
	io(); int n, k;
	cin >> n >> k >> (s + 1);
	int cnt = 0, sum = 0;
	while (1) {
		bool flag = false;
		cnt++;
		for (int i = 1; i < n; ++i) {
			if (s[i] == 'R' && s[i + 1] == 'L') {
				flag = true;
				vec[cnt].emplace_back(i);
			}
		}
		for (auto it : vec[cnt]) swap(s[it], s[it + 1]);
		sum += vec[cnt].size();
		if (!flag) break;
	}
    
	cnt--;
	if (k < cnt || k > sum) {
		printf("-1\n");
		return 0;
	}
 
	for (int i = 1; i <= cnt; ++i) {
		while (!vec[i].empty() && k > cnt - i + 1) {
			cout << "1 " << vec[i].back() << '\n';
			vec[i].pop_back();
			k--;
		}
		if (!vec[i].empty()) {
			cout << vec[i].size();
			for (auto it : vec[i]) cout << ' ' << it;
			cout << '\n';
			k--;
		}
	}
}

F.ケイトと不完全性

問題の意味:集合\(S = \ {1,2、 \ cdots、N \} \) 、各整数用のn \(N- \ GEQ K> 1 \) サイズを見つけるために(\ Kを\ )サブセット、その結果、最小のサブ最大濃度二十から二最大公約数、この最小需要。

分析:我々は最大の最小セットを構築する方法を検討し二十から二最大公約数は、もちろん、最初にスローされたすべての素数の集合であり、その後、最大公約数がセット内の数字となっている置く\(= 2 \ )で失われた数、そして\(= 3 \)数......それから、我々は合成数を追加した場合、すべての彼は、コレクション内の要因となっている必要があることに気づいた、この番号を追加すると発生することができるので、最大公約数は、エジプトと貪欲は、このプロセスを維持ふるいので、出力は再びソートすることができ、彼の最大の要因です。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
void io() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); }
map<ll, ll> MP;

int main() {
	io(); int n;
	cin >> n;
	vector<int> ans(n + 1, 1);
	for (int i = 2; i <= n; ++i) {
        for (int j = i + i; j <= n; j += i) {
            ans[j] = i;
        }
	}
    sort(ans.begin(), ans.end());
    for (int i = 2; i <= n; ++i) cout << ans[i] << ' ';
}

おすすめ

転載: www.cnblogs.com/st1vdy/p/12664248.html