您的位置:首页 > 其它

Codeforces Round #356 (Div. 2)

2016-06-15 22:05 501 查看
5/5

懒啊懒啊~~屯了一堆题没补,GG……

最近要期末考试,博客也搁置很久没有更新了,虽然更新也没人看,但是还是要定期写点东西。

水了一场CF,最大的感想是CF红名果然很难,但是坚持打更重要,所以不要以实力不够为借口,每次还是爆一下肝肛一下CF,万一红名了呢?

在这里我决定每次新的一场CF出来之前,都把题目补好,然后迎接新的CF,最近真的没时间刷题orz,这么蒟蒻还不刷题QAQ

题A Bear and Five Cards

题意:只允许移动两个或者三个相同的t,然后问你剩下最小的和是多少?

题解:水题。

/*zhen hao*/
#include <bits/stdc++.h>
using namespace std;

const int maxn = 510, dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};
char maze[maxn][maxn];
int n, k;
int id[maxn][maxn], size[maxn * maxn], cur[maxn * maxn];

bool inside(int x, int y) {
return x >= 0 && x < n && y >= 0 && y < n;
}

void dfs(int x, int y, int num) {
id[x][y] = num;
size[num]++;
for (int i = 0; i < 4; i++) {
int xx = x + dx[i], yy = y + dy[i];
if (inside(xx, yy) && maze[xx][yy] == '.' && id[xx][yy] == 0)
dfs(xx, yy, num);
}
}

void add(int x, int y, int& now, int current) {
if (inside(x,y) && maze[x][y] == '.') {
int i = id[x][y];
if (cur[i] != current) {
cur[i] = current;
now += size[i];
}
}
}

int main() {
//  freopen("case.in", "r", stdin);
cin >> n >> k;
for (int i = 0; i < n; i++) {
scanf("%s", maze[i]);
}
int cnt = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (maze[i][j] == '.' && id[i][j] == 0) dfs(i, j, ++cnt);

int best = 0, current = 0;
for (int nowx = 0; nowx + k <= n; nowx++) {
for (int x = nowx; x < nowx + k; x++) for (int y = 0; y < k; y++) --size[id[x][y]];
for (int nowy = 0; nowy + k <= n; nowy++) {
int now = k * k;
current++;
for (int x = nowx; x < nowx + k; x++) {
add(x, nowy - 1, now, current);
add(x, nowy + k, now, current);
}
for (int y = nowy; y < nowy + k; y++) {
add(nowx - 1, y, now, current);
add(nowx + k, y, now, current);
}
best = max(best, now);
if (nowy + k != n) {
for (int x = nowx; x < nowx + k; x++) {
++size[id[x][nowy]];
--size[id[x][nowy + k]];
}
}
}
for (int x = nowx; x < nowx + k; x++) for (int y = n - k; y < n; y++) ++size[id[x][y]];
}
cout << best << endl;
}


代码君
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: