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; //少写一行是一行
}
\
\
\
\
\
\