1. 程式人生 > >[Codeforces Round #530 (Div. 2)] A,B,C

[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]);
                }
            }
        }
    }
}