Educational Codeforces Round 167 (Rated for Div. 2) 部分题解A~D

A. Catch the Coin

题目大意

给定一个无限大的网格,网格内分布着一些硬币。硬币会在每次行动之后往下掉落一格。

初始位置在(0,0),可以向周围八个方向上移动。

问对于每个硬币来说,是否可以被接到。

思路

只需要考虑在-1上方的即可,对于这些通过移动必然可以取到。

因为是先移动,再硬币掉落,所以考虑-1位置也满足。

横向距离没有意义,可以斜着走。

代码实现
void solve() {
    ll n; cin >> n;
    vector<pair<ll, ll>>o(n);
    for (int i = 0; i < n; i++) {
        cin >> o[i].first >> o[i].second;
        if (-1 <= o[i].second) {
            cout << "YES\n";
        }
        else {
            cout << "NO\n";
        }
    }
}

B. Substring and Subsequence

题目大意

给定两个串,要求求出一个最短串,其中包含子串a和子序列b。

思路

A作为子串,字符的相对位置不能变,所以我们可以根据A串做匹配。

看B串中最多多少个连续的字符可以与A串对应。

代码实现
void solve() {
    string a, b; cin >> a >> b;
    ll ans = LLONG_MAX;
    for (int l = 0; l < b.size(); l++) {
        ll cnt = 0;
        ll lll = l;
        for (int i = 0; i < a.size(); i++) {
            if (b[lll] == a[i]) {
                lll++;
                cnt++;
            }
            if (lll == b.size())break;
        }
        ans = min(ans, (ll)b.size() - cnt + (ll)a.size());
    }
    cout << ans << "\n";
}

C. Two Movies

题目大意

有两部电影,n个人每个人分别对这两部电影进行评价,每个人的评价只取其中一个,要求两部电影中获得最小值的最高分。

思路

考虑贪心。

对于评价 1 -1 、-1 1 ,0 1,1 0,这些情况,我们只需要取1加上即可,对答案做正贡献。

对于1 1,我们考虑哪个少就给哪个加。

对于-1 -1,我们考虑哪个多就给哪个减。

代码实现
void solve() {
    ll n; cin >> n;
    vector<pair<ll, ll>>o(n);
    for (int i = 0; i < n; i++) {
        cin >> o[i].first;
    }
    for (int i = 0; i < n; i++) {
        cin >> o[i].second;
    }
    ll yy = 0, nn = 0;
    ll ans1 = 0;
    ll ans2 = 0;
    for (int i = 0; i < n; i++) {
        if (o[i].first == o[i].second && o[i].first == 1)yy++;
        else if (o[i].first == o[i].second && o[i].first == -1)nn++;
        else {
            if (o[i].first > o[i].second)ans1 += o[i].first;
            else ans2 += o[i].second;
        }
    }
    while (yy || nn) {
        if (yy) {
            yy--;
            if (ans1 < ans2) {
                ans1 += 1;
            }
            else {
                ans2 += 1;
            }
        }
        else {
            nn--;
            if (ans1 > ans2) {
                ans1 -= 1;
            }
            else {
                ans2 -= 1;
            }
        }
    }
    cout << min(ans1, ans2) << "\n";
}

D. Smithing Skill

题目大意

给定n种武器,每个武器被铸造和融化均会提供一点经验值。

对于每个武器,铸造需要消耗x个同种材料,融化得到y个同种材料。

给定m种材料,要求求出最大经验值。

思路

正解应该为DP,本文介绍另种非正解做法,可以卡过去。

对于武器,我们优先去做x-y更小的。

然后循环每个武器,我们可以按照材料的多少从大到小进行判断,该个武器可以做多少个。

大致思路定下来,开始优化部分逻辑。

对于同一数量的材料,我们可以一起进行处理,类似去做离散化。

(下面代码来自队友,自己写的空间没卡过去,感觉比较神奇)

代码实现
struct node {
    ll a, b;
};
node arr[2000002];
bool cmp3(node x, node y) {
    return (x.a - x.b) < (y.a - y.b);
}
void solve() {
    ll n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> arr[i].a;
    }
    for (int i = 1; i <= n; i++) {
        cin >> arr[i].b;
    }
    map<ll, ll>crr;
    priority_queue<ll>brr;
    map<ll, ll>mark;
    for (int i = 1; i <= m; i++) {
        ll f;
        cin >> f;
        if (mark[f]) {
            mark[f]++;
            continue;
        }
        brr.push(f);
        mark[f]++;
    }
    
    ll ans = 0;
    sort(arr + 1, arr + 1 + n, cmp3);
    for (int i = 1; i <= n; i++) {
        while (brr.top() >= arr[i].a) {
            ll x = brr.top();
            brr.pop();
            ll k = mark[x];
            mark[x] = 0;
            ll g = arr[i].a - arr[i].b;
            ll s = x - arr[i].a;
            ll sum = s / g + 1;
            x = x - sum *g;
            ans = ans + sum * k;
            if (mark[x]) {
                
                mark[x] += k;
                continue;
            }
            else {
                brr.push(x);
                mark[x] = k;
            }
        }
        
    }
    cout << ans * 2;
}

"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法和数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值