Codeforces Round 923 (Div. 3)【题解A-D】

文章讲述了四个编程问题,涉及字符串处理(查找最左边和最右边的黑块),字符计数转换字符串,判断数组中能否选取特定数量的不同元素,以及在一个数组中查找连续不同元素的下标。
摘要由CSDN通过智能技术生成

A. Make it White

题意:找到最左最右边的黑块,计算距离

#include<bits/stdc++.h>
#define Max 0x7fffffff
#define  LL long long
#define  ULL unsigned long long
#define N 1000005
//#define int long long
#define  mod 1000000007
using namespace std;
string s; map<string, int>mp;
signed main() {
    int t; scanf("%d", &t);
    while (t--) {
        int n; scanf("%d", &n);
        cin >> s;
        int p=0, e=0;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == 'B') {
                p = i; break;
            }
        }
        for (int i = s.size();i>=0 ; i--) {
            if (s[i] == 'B') {
                e = i;
                break;
            }
        }
        printf("%d\n", e - p + 1);
    }
}

B. Following the String 

题意:给你一串数字,表示a-z字母出现的次数,例:[0,0,1,2]对应的字符串为"abaa"

思路:统计每个数字出现的个数,用‘a’加上,相当于用字符表示数字出现的次数,第一次出现就是'a',第二次就是'b';

#include<bits/stdc++.h>
#define Max 0x7fffffff
#define  LL long long
#define  ULL unsigned long long
#define N 1000005
//#define int long long
#define  mod 1000000007
using namespace std;
signed main() {
    int T; scanf("%d", &T);
    while (T--) {
        int n; scanf("%d", &n);
        vector<int> a(n + 1);
        for (int i = 0; i < n; i++) {
            int t; scanf("%d", &t);
            printf("%c", 'a' + a[t]);
            a[t]++;
        }
        printf("\n");
        
    }
}

C. Choose the Different Ones! 

题意:判断是否能从两个数组中取出k/2个数组成1-k;

思路:只要判断两个数组中1-k的独立出现的数字个数不大于k/2个就行了,前提是1-k中的数都存在

#include<bits/stdc++.h>
#define Max 0x7fffffff
#define  LL long long
#define  ULL unsigned long long
#define N 1000005
//#define int long long
#define  mod 1000000007
using namespace std;
signed main() {
    int T; scanf("%d", &T);
    while (T--) {
        int n, m, k; scanf("%d%d%d", &n, &m, &k);
        vector<int>p(k + 1, 0), p1(k+ 1, 0); unordered_map<int, int>mp;
        for (int i = 0; i < n; i++) {
            int t; scanf("%d", &t);
            if (t <= k) {
                if (p1[t] == 0)
                    p[t]++, mp[t]++, p1[t]++;
            }
        }
        vector<int>p2(k+ 1, 0);
        for (int i = 0; i < m; i++) {
            int t; scanf("%d", &t);
            if (t <= k) {
                if (p2[t] == 0)
                    p[t]++, p2[t]++;
            }
        }
        int cnt = 0, d1 = 0, d2 = 0, fl = 0;
        for (int i = 1; i <= k; i++) {
            if (p[i] == 0) {
                fl = 1;
                break;
            }
            else if (p[i] >= 2)continue;
            if (mp[i])d1++;
            else d2++;
        }
        if (fl)printf("NO\n");
        else if (d1 <= k / 2 && d2 <= k / 2)printf("yes\n");
        else printf("no\n");


    }
}

 D. Find the Different Ones!

题意:n个数,q次询问,l,r,之间有没有不同的,有的话输出下标,没有输出-1,-1.

思路:预处理,找到每个数下一个不同的位置d[i],判断d[i]<=r是的话输出l,d[l],否则输出-1 -1.

#include<bits/stdc++.h>
#define Max 0x7fffffff
#define  LL long long
#define  ULL unsigned long long
#define N 1000005
//#define int long long
#define  mod 1000000007
using namespace std;
int a[N];
signed main() {
    int T; scanf("%d", &T);
    while (T--) {
        
        int n; scanf("%d", &n);
        vector<int>b(n+1,0);
        for (int i = 1; i <= n; i++) {
            scanf("%d", &a[i]);
        } 
        int i = 1;
        while (i <= n) {
            int j = i;
            while (j + 1 <= n && a[i] == a[j + 1]) {
                j++;
            }
            for (int k = i; k <= j; k++) { b[k] = j + 1; }
            i = j + 1;
        }
        int q; scanf("%d", &q);
        while (q--) {
            int l, r,fl=0; scanf("%d%d", &l, &r);
            if (b[l] <= r&&b[l]>0)
                printf("%d %d\n", l,b[l]);
            else  
                printf("-1 -1\n");

        }
        printf("\n");
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值