CF - Educational Codeforces Round 25

A.Binary Protocol

题目链接

题意: 将每段连续1的个数输出,以0结尾,注意最后如果有0还要多输出一个0

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<time.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>

#define pi acos(-1)
#define maxn 111111
#define maxm 11111
#define INF 0x3F3F3F3F
#define eps 1e-8

#define pb push_back

#define mem(a) memset(a,0,sizeof a)

using namespace std;

const long long mod = 1000000007;
/**lyc**/
void init() {

}
char s[111];
int main() {
    int n;
    while(scanf("%d", &n) != EOF) {
        scanf("%s", s);
        int ans = 0;
        for(int i = 0; i < n; i++) {
            if(s[i] == '1') {
                ans++;
            }
            else {
                printf("%d", ans);
                ans = 0;
            }
            //cout << ans <<endl;
        }
        printf("%d", ans);
        printf("\n");
    }
    return 0;
}

B.Five-In-a-Row

题目链接

题意:两人走五子棋,判断先手是否一步就能赢,枚举每一个五元组就好了

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<time.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>

#define pi acos(-1)
#define maxn 111111
#define maxm 11111
#define INF 0x3F3F3F3F
#define eps 1e-8

#define pb push_back

#define mem(a) memset(a,0,sizeof a)

using namespace std;

const long long mod = 1000000007;
/**lyc**/
void init() {

}
char s[12][12];
int a[12][12];
int main() {
    for(int i = 0; i < 10; i++) {
        scanf("%s", s[i]);
    }
    for(int i = 1; i <= 10; i++) {
        for(int j = 1; j <= 10; j++) {
            if(s[i - 1][j - 1] == '.') a[i][j] = 0;
            if(s[i - 1][j - 1] == 'X') a[i][j] = 1;
            if(s[i - 1][j - 1] == 'O') a[i][j] = 2;
        }
    }
    int fa = 0;
    ///横的
    int num0, num1;
    for(int i = 1; i <= 10; i++) {
        for(int j = 1; j <= 6; j++) {
            num0 = 0; num1 = 0;
            for(int k = 0; k < 5; k++) {
                if(a[i][j + k] == 0) num0++;
                if(a[i][j + k] == 1) num1++;
            }
            if(num1 == 4 && num0 == 1) {fa = 1;break;}
        }
        if(fa == 1) break;
    }
    ///竖的
    for(int i = 1; i <= 10; i++) {
        for(int j = 1; j <= 6; j++) {
            num0 = 0; num1 = 0;
            for(int k = 0; k < 5; k++) {
                if(a[j + k][i] == 0) num0++;
                if(a[j + k][i] == 1) num1++;
            }
            if(num1 == 4 && num0 == 1) {fa = 1;break;}
        }
        if(fa == 1) break;
    }
    ///右下
    for(int i = 1; i <= 6; i++) {
        for(int j = 1; j <= 6; j++) {
            num0 = 0; num1 = 0;
            for(int k = 0; k < 5; k++) {
                if(a[j + k][i + k] == 0) num0++;
                if(a[j + k][i + k] == 1) num1++;
            }
            if(num1 == 4 && num0 == 1) {fa = 1;break;}
        }
        if(fa == 1) break;
    }
    ///左下
    for(int i = 5; i <= 10; i++) {
        for(int j = 1; j <= 6; j++) {
            num0 = 0; num1 = 0;
            for(int k = 0; k < 5; k++) {
                if(a[j + k][i - k] == 0) num0++;
                if(a[j + k][i - k] == 1) num1++;
            }
            if(num1 == 4 && num0 == 1) {fa = 1;break;}
        }
        if(fa == 1) break;
    }
    if(fa == 1) printf("YES\n");
    else printf("NO\n");
    return 0;
}

C.Multi-judge Solving

题目链接

题意: 首先有一个条件,如果要想刷难度是d的题目,之前一定要刷果难度 >=d2 的题目, 然后给你n个难度的题目,和一个以之前刷过最高难度的题目,然后问你除了刷这些题目以外,还要额外刷多少题目。

思路:每次不断乘2就可以了。如果有断档,ans就+1

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<time.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>

#define pi acos(-1)
#define maxn 111111
#define maxm 11111
#define INF 0x3F3F3F3F
#define eps 1e-8

#define pb push_back

#define mem(a) memset(a,0,sizeof a)

using namespace std;

const long long mod = 1000000007;
/**lyc**/
int n, k;
int a[1111];
int main() {
    while(scanf("%d%d", &n, &k) != EOF) {
        for(int i = 1; i <= n; i++) {
            scanf("%d", &a[i]);
        }
        sort(a + 1, a + n + 1);
        int ans = 0;
        int l = 1;
        while(l <= n) {
            while(a[l] > 2 * k) {
                ans++;
                k *= 2;
            }
            k = max(k, a[l]);
            l++;
        }
        printf("%d\n", ans);
    }
    return 0;
}

D.Suitable Replacement

题目链接

题意:给你两个字符串s,t。然后s中有’?’即不确定的字母,可以随意变换。问s中最多能有多少个t,可以随意打乱字母顺序,所以最后就是一个统计一下字母个数,然后处理一下。最后填到s中,如果有多余就填个’a’好了。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<time.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>

#define pi acos(-1)
#define maxn 111111
#define maxm 11111
#define INF 0x3F3F3F3F
#define eps 1e-8

#define pb push_back

#define mem(a) memset(a,0,sizeof a)

using namespace std;

const long long mod = 1000000007;
/**lyc**/
void init() {

}
char s[1111111];
char t[1111111];
int nums[30];
int numt[30];
int anss[30];
int main() {
    scanf("%s%s", s, t);
    int lens = strlen(s);
    int lent = strlen(t);
    memset(nums, 0, sizeof nums);
    memset(numt, 0, sizeof numt);
    int emp = 0;
    for(int i = 0; i < lens; i++) {
        if(s[i] == '?') emp++;
        else nums[s[i] - 'a']++;
    }
    for(int i = 0; i < lent; i++) {
        numt[t[i] - 'a']++;
    }
    int temp;
    for(temp = 1; ; temp++) {
        int res = 0;
        for(int i = 0; i < 26; i++) {
            res += max(numt[i] * temp - nums[i], 0);
        }
        if(res > emp) {
            temp--;
            break;
        }
    }
    for(int i = 0; i < 26; i++) {
        anss[i] = max(numt[i] * temp - nums[i], 0);
    }
   // for(int i = 0; i < 26; i++) {
   //     cout << anss[i] << " ";
   // }
    int tt = 0;
    for(int i = 0; i < lens; i++) {
        if(s[i] == '?') {
            while(anss[tt] == 0 && tt < 26) tt++;
            if(tt == 26) {
                s[i] = 'a';
                continue;
            }
            s[i] = tt + 'a';
            anss[tt]--;
        }
    }
    printf("%s", s);
    return 0;
}
















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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值