codeforces 423 ABC三题题解

42 阅读1分钟

codeforces.com/contest/828\

A

模拟题,顺着题意来

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

int main()
{
	int n, a, b;
	while(~scanf("%d%d%d", &n, &a, &b)) {
		int tmp = 0, cnt = 0, group;
		for (int i = 0; i < n; ++i) {
			scanf("%d", &group);
			if (group != 1) {
				if (b > 0) b--;
				else cnt += 2;
			}
			else {
				if (a > 0) a--;
				else {
					if (b > 0) {
						b--;
						tmp++;
					} 
					else {
						if (tmp > 0) tmp--;
						else cnt++;
					}
				}
			}
		}
		printf("%d\n", cnt);
	} 
	
	return 0;
}


B

我没读懂题。室友说就是找一个足够大的方块,把所有黑块覆盖。

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio> 
#include <algorithm>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
const int N = 107;
string str[N];
int main()
{
	int n, m;
	while(cin >> n >> m) {
		for (int i = 0; i < n; ++i)
			cin >> str[i];
		int x[3], y[3], cnt = 0;
		x[1] = y[1] = N; //x[1], y[1] 存左上角坐标, 
		x[2] = y[2] = -1;
		for (int i = 0; i < n; ++i) {
			for (int j = 0; j < m; ++j) {
				if (str[i][j] == 'B') {
					x[1] = min(x[1], i);
					y[1] = min(y[1], j);
					x[2] = max(x[2], i);
					y[2] = max(y[2], j); 
					cnt++;
				}
			}
		}
		if (x[1] == N ) puts("1"); //全是白块
		else {
			int len = max(x[2] - x[1] + 1, y[2] - y[1] + 1);
			if (len > min(n, m)) puts("-1");
			else printf("%d\n", len * len - cnt);
		}
	}	
	
	return 0;
}


C

C题容易TLE MLE

注意一下,已经确认的字符,不要在覆盖了,不然会超时

#define _CRT_SECURE_NO_WARNINGS 
#include <algorithm>
#include <cstdio>
#include <cstring>
const int N = 3000007; //不开太大会MLE
char str[N];
char sub[N];
int fa[N];
int find(int x) {
	return fa[x] == x ? x : fa[x] = find(fa[x]);
} 
int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < N; ++i)
		str[fa[i] = i] = 'a'; //这种初始化操作头次见
	int maxv = 0;
	while (n--) {
		scanf("%s", sub);
		int len = strlen(sub);
		int m, pos;
		scanf("%d", &m);
		while (m--) {
			scanf("%d", &pos);
			--pos;
			int y = pos, right = pos + len;
			maxv = std::max(maxv, right); //原串至少的长度
			while ((y = find(y)) < pos + len) {
				str[y] = sub[y - pos];
				fa[y] = y + 1; //位置y的字符已经确定,不用再覆盖
			}
		}
	}
	str[maxv] = '\0';
	return printf("%s\n", str) & 0; //少写一行是一行
}


\

\

\

\

\

\