寒假训练第十一天-Codeforces Round #222 (Div. 2)

寒假训练第十一天-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;
}

总结:希望能稳定三题呀。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页