Codeforces Round 950 (Div. 3)

A. Problem Generator

思路:暴力模拟,对于每个字母,如果不足m mm,就加入最终答案.

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define N 2000005
#define mod 100003
typedef long long ll;
ll n, m, t, cnt, ans, sum1,sum2, maxx,k;
int x, y;
int a[N], b[N], c[N],dis[N];
bool vis[N];
vector<int>G[N];
typedef pair<int, int>pii;
priority_queue<pii, vector<pii>, greater<pii>>q;
struct node {
    int a, b, c,flag;
}f[N];
int main()
{
    cin >> t;
    void solve();
    while (t--) {
        solve();
    }
    return 0;
}
void solve()
{
    cin >> n >> m;
    ans = 0;
    string s;
    cin >> s;
    map<char, ll>p;
    for (int i = 0; i < s.size(); i++) {
        p[s[i]]++;
    }
    for (int i = 'A'; i <= 'G'; i++) {
        ans += max((ll)0, m - p[i]);
    }
    cout << ans << endl;
}

B. Choosing Cubes

思路:

我们只需要检査排完序之后比较在k位置的立方体ak与最喜欢的立方体af,的大小即可,如果ak>af,说明af的位置在k之前,一定会波删;如果ak< af,说明af的位置在k之后,一定不会被删;如果ak= af,检査ak+1,如果ak+1 = af,则有可能被删,否则一定被删。

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define N 2000005
#define mod 100003
typedef long long ll;
ll n, m, t, cnt, ans, sum1,sum2, maxx,k;
int x, y;
int a[N], b[N], c[N],dis[N];
bool vis[N];
vector<int>G[N];
typedef pair<int, int>pii;
priority_queue<pii, vector<pii>, greater<pii>>q;
struct node {
    int a, b, c,flag;
}f[N];
bool cmp(int x, int y) {
    return x > y;
}
int main()
{
    cin >> t;
    void solve();
    while (t--) {
        solve();
    }
    return 0;
}
void solve()
{
    cin >> n >> m >> k;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    cnt = a[m];
    sum1 = sum2 = 0;
    sort(a + 1, a + 1 + n, cmp);
    for (int i = 1; i <= n; i++) {
        if (cnt == a[i]) {
            sum1 = i;
            break;
        }
    }
    for (int i = n; i >= 1; i--) {
        if (cnt == a[i]) {
            sum2 = i;
            break;
        }
    }
    if (k < sum1) {
        cout << "NO" << endl;
        return;
    }
    else if(k>=sum2){
        cout << "YES" << endl;
        return;
    }
    else {
        cout << "MAYBE" << endl;
        return;
    }
}

C. Sofia and the Lost Operations


思路:

若最后一个修改数存在于b数组中,那么只需要看这些修改的数能否把a数组中待修改的数全部覆盖即可,否则一定不存在。

实现代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
using namespace std;
#define N 2000005
#define mod 7777777
typedef long long ll;
int n, m, t, cnt, ans, sum1,sum, maxx;
int x, y;
int a[N], b[N],d[N];
bool vis[N];
map<int, int>k, dis;
int main()
{
    cin >> t;
    void solve();
    int gcd(int x, int y);
    while (t--) {
        solve();
    }
    return 0;
}
void solve()
{
    cin >> n;
    sum = 0;
    k.clear(), dis.clear();
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    for (int i = 1; i <= n; i++)
        scanf("%d", &b[i]), dis[b[i]]++;
    cin >> m;
    for (int i = 1; i <= m; i++)
        scanf("%d", &d[i]),k[d[i]]++;
    if (!dis[d[m]]) {
        cout << "NO" << "\n";
        return;
    }
    if (dis.find(d[m]) == dis.end()) {
        cout << "NO" << "\n";
        return;
    }
    else {
        bool flag = 1;
        for (int i = 1; i <= n; i++) {
            if (a[i] != b[i]) {
                if (!k[b[i]]) {
                    flag = 0;
                    break;
                }
                k[b[i]]--;
            }
        }
        if (flag) {
            cout << "YES" << "\n";
            return;
        }
        else {
            cout << "NO" << "\n";
            return;
        }
    }
}

D. GCD-sequence

 思路:

将删除前的gcd序列求出来,可以发现若要满足题意,必然需要找到gcd序列中递减的位置,并且删除与之相关的数(要记录前后两个数和他本身)。然后判断删除后的序列能否形成非递减即可。

(因为要找到递减的两个数,其原数列是三个连续数决定的,所以要记录者三个数)

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
#define N 2000005
#define mod 7777777
typedef long long ll;
int n, m, t, cnt, ans, num1, num2, num3, maxx;
int x, y;
int a[N], b[N],d[N];
bool vis[N];
map<int, int>k, dis;
vector<int>dp2, dp3;
int gcd(int a, int b) {
    return b > 0 ? gcd(b, a % b) : a;
}
bool judge() {
    for (int i = 1; i <n-2; i++) {
        if (dp3[i] >= dp3[i - 1]) {
            continue;
        }
        else {
            return false;
        }
    }
    return true;
}
int main()
{
    cin >> t;
    void solve();
    while (t--) {
        solve();
    }
    return 0;
}
void solve()
{
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> a[i];
    vector<int>dp1;
    for (int i = 1; i < n; i++) {
        dp1.push_back(gcd(a[i], a[i - 1]));
    }
    num1 = num2 = num3 = -1;
    for (int i = dp1.size()-1; i >= 1; i--) {
        if (dp1[i - 1] > dp1[i]) {
            num1 = i + 1;
            num2 = i;
            num3 = i - 1;
            break;
        }
    }
    if (num1 == -1) {
        cout << "YES" << endl;
        return;
    }
    else {
        dp2.clear(), dp3.clear();
        for (int i = 0; i < n; i++) {
            if (i == num1)
                continue;
            dp2.push_back(a[i]);
        }
        for (int i = 1; i < n-1; i++) {
            dp3.push_back(gcd(dp2[i], dp2[i - 1]));
        }
        if (judge()) {
            cout << "YES" << endl;
            return;
        }
        dp2.clear(), dp3.clear();
        for (int i = 0; i < n; i++) {
            if (i == num2)
                continue;
            dp2.push_back(a[i]);
        }
        for (int i = 1; i < n - 1; i++) {
            dp3.push_back(gcd(dp2[i], dp2[i - 1]));
        }
        if (judge()) {
            cout << "YES" << endl;
            return;
        }
        dp2.clear(), dp3.clear();
        for (int i = 0; i < n; i++) {
            if (i == num3)
                continue;
            dp2.push_back(a[i]);
        }
        for (int i = 1; i < n - 1; i++) {
            dp3.push_back(gcd(dp2[i], dp2[i - 1]));
        }
        if (judge()) {
            cout << "YES" << endl;
            return;
        }
        cout << "NO" << endl;
    }
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Codeforces Round 894 (Div. 3) 是一个Codeforces举办的比赛,是第894轮的Div. 3级别比赛。它包含了一系列题目,其中包括题目E. Kolya and Movie Theatre。 根据题目描述,E. Kolya and Movie Theatre问题要求我们给定两个字符串,通过三种操作来让字符串a等于字符串b。这三种操作分别为:交换a中相同位置的字符、交换a中对称位置的字符、交换b中对称位置的字符。我们需要先进行一次预处理,替换a中的字符,然后进行上述三种操作,最终得到a等于b的结果。我们需要计算预处理操作的次数。 根据引用的讨论,当且仅当b[i]==b[n-i-1]时,如果a[i]!=a[n-i-1],需要进行一次操作;否则不需要操作。所以我们可以遍历字符串b的前半部分,判断对应位置的字符是否与后半部分对称,并统计需要进行操作的次数。 以上就是Codeforces Round 894 (Div. 3)的简要说明和题目E. Kolya and Movie Theatre的要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Codeforces Round #498 (Div. 3) (A+B+C+D+E+F)](https://blog.csdn.net/qq_46030630/article/details/108804114)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Codeforces Round 894 (Div. 3)A~E题解](https://blog.csdn.net/gyeolhada/article/details/132491891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值