[Codeforces Round #530 (Div. 2)] A,B,C

[Codeforces Round #530 (Div. 2)] A,B,C

前言:

这是一场十分难受的cf,分数1551 → 1548,基本上算是变化不大,4min出的A,有点慢,但是考虑到题意稍微有点坑人,总的来说能够接受,9min莽了一发B,然后就开始开C,C的做法不是特别好,在调试的时候出了一点问题,WA了几发,45min出的C,(这个时候就开始被队友陆陆续续超过了,后期乏力,我恨啊),到最后D都没有调的出来,赛后学长告诉我这个地方用DFS的写法可能会更好一点,还是重新去补一下好了。前期题的速度基本上算是可以保证了,下面补题的重心应该在三四两题了,蓝瘦香菇。

A. Snowball

题意
从某个高度开始有一个雪球滚落,会根据高度不断积攒自己的重量,途中有两块石头,撞到石头要减去石头的重量,如果不足,则置零,但是注意,即使质量为零,雪球也不会停止滚动。
做法
按题意暴力模拟就好了
代码

#include <cstdio>
using namespace std;
int main()
{
    int n,h;
    scanf("%d%d",&n,&h);
    int u1,u2,d1,d2;
    scanf("%d%d%d%d",&u1,&d1,&u2,&d2);
    for(int i=h;i>0;i--)
    {
        n+=i;
        if(i==d1)
            n = max(0,n-u1);
        if(i==d2)
            n = max(0,n-u2);
    }
    printf("%d",n);
}

B. Squares and Segments

题意
Sofia想做出n个小正方形,问她最少需要用尺规做出几条边。
理解下来的意思就是说,我们需要一个使得(x+y)尽可能小的x*y的表格可以放下n个小正方形。
做法
对n开根号,求出一条边x,另一条对n除x做上取整。
代码

#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    int ans = sqrt(n);
    ans += (n+ans-1)/ans;
    printf("%d",ans);
}

C. Postcard

题意
给定一个字符串,对于每一个‘ ? ’可以删去或保留前面的一个字符,对于每一个’ * ',可以删去或保留或重复多次前一个字符。再给定一个数,问,是否有满足长度要求和操作要求的串,如果有,输出,如果没有,返回-1。
做法
统计?和*的个数,对不同的情况进行分类处理。
代码

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
char a[1000];
int main()
{
    scanf("%s",a);
    int k;
    scanf("%d",&k);
    int len = strlen(a);
    int cntc = 0;
    int cnts = 0;
    for(int i=0; i<len; i++)
    {
        if(a[i]=='?')
            cntc++;
        if(a[i]=='*')
            cnts++;
    }
    if(k<len-2*cntc-2*cnts)
    {
        printf("Impossible\n");
        return 0;
    }
    if(cnts==0)
    {
        int tmp = len - cntc - k;
        if(tmp<0)
        {
            printf("Impossible\n");
            return 0;
        }
        for(int i=0; i<len; i++)
        {
            if(a[i+1]=='?')
            {
                if(tmp)
                    tmp--;
                else
                    printf("%c",a[i]);
                i++;
            }
            else
            {
                printf("%c",a[i]);
            }
        }
    }
    else
    {
        int tmp = len - cntc -cnts - k;
        if(tmp>0)
        {
            for(int i=0; i<len; i++)
            {
                if(a[i+1]=='?'||a[i+1]=='*')
                {
                    if(tmp)
                        tmp--;
                    else
                        printf("%c",a[i]);
                    i++;
                }
                else
                {
                    printf("%c",a[i]);
                }
            }
        }
        else
        {
            for(int i=0; i<len; i++)
            {
                if(a[i+1]=='?')
                {
                    printf("%c",a[i]);
                    i++;
                }
                else if(a[i+1]=='*')
                {
                    while(tmp<0)
                    {
                        printf("%c",a[i]);
                        tmp++;
                    }
                    printf("%c",a[i]);
                    i++;
                }
                else
                {
                    printf("%c",a[i]);
                }
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42680479/article/details/85925340