寒假训练第十一天-Codeforces Round #222 (Div. 2)
前言:日常过三题,时间长不写图论连dfs都写的吃力了起来,真是个fw。
题目链接-https://codeforces.com/contest/378
A-Playing with Dice
题意:掷骰子,每人给两个数,掷6次,掷的点数离谁给的数谁就赢,输出最终对局情况。
题解:计算掷出的数离谁给的数近即可。
int32_t main()
{
ICO;
int a, b;
cin >> a >> b;
int n1 = 0, n2 = 0, n3 = 0;
for(int i = 1; i <= 6; i++)
{
int p = abs(i - a), q = abs(i - b);
if(p < q) n1++;
else if(p == q) n2++;
else n3++;
}
cout << n1 << ' ' << n2 << ' ' << n3 << endl;
return 0;
}
B-Semifinals
题意:比赛选拔,选n个人,现有两队分别比赛,每队n人,选拔规则为先从每队选拔k(0 ≤ 2k ≤ n)人,然后再从两队剩余的人中选拔n - 2 * k人,但是现在k不定,问你每队有哪些人可能被选上。
题解:既然是可能,那我们只需要考虑两种极端情况:
1、2k = n:那每队的前一半人都有可能被选上;
2、k = 0:我们只需要将这2n个人按成绩排好即可,然后选择成绩靠前的n人。
int a, b;
bool ok1[maxn], ok2[maxn];
vector<pair<int, int> > v;
int32_t main()
{
ICO;
int n;
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> a >> b;
v.push_back({
a, 1}), v.push_back({
b, 2});
}
sort(v.begin(), v.end());
for(int i = 1; i <= (n >> 1); i++) ok1[i] = ok2[i] = 1;
int it1 = 0, it2 = 0;
for(int i = 0; i < n; i++) if(v[i].second == 1) ok1[++it1] = 1; else ok2[++it2] = 1;
for(int i = 1; i <= n; i++) if(ok1[i]) cout << 1; else cout << 0;
cout << endl;
for(int i = 1; i <= n; i++) if(ok2[i]) cout << 1; else cout << 0;
return 0;
}
C-Maze
题意:给一块图(里面的空地是连通的),现在要把k块空地变成墙,但是必须保证改变后的空地仍然是连通的,输出改变后的图。
题解:我们可以先把dfs遍历连通图到最低层,然后把一步一步向前将k块空地改为墙,因为是从后往前,所以每次改变都能保证其他的空地是连通的。
int n, m, k;
char s[510][510];
int ok[510][510];
int d[4][2] = {
1, 0, 0, -1, -1, 0, 0, 1};
void dfs(int x, int y)
{
for(int i = 0; i < 4; i++)
{
int xx = x + d[i][0], yy = y + d[i][1];
if(xx < 1 || xx > n || yy < 1 || yy > m || ok[xx][yy]) continue;
ok[xx][yy] = 1;
dfs(xx, yy);
}
if(k <= 0) return;
k--, ok[x][y] = 2;
}
int32_t main()
{
ICO;
cin >> n >> m >> k;
for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++)
{
cin >> s[i][j]; if(s[i][j] == '#') ok[i][j] = 1;}
for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++)
if(ok[i][j] == 0) dfs(i, j);
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
if(ok[i][j] == 2) cout << 'X';
else cout << s[i][j];
}
cout << endl;
}
return 0;
}
总结:希望能稳定三题呀。