Codeforces Round 894 (Div. 3)

本文概述了几道来自CodeforcesRound894(Div.3)的编程题目,包括GiftCarpet、SequenceGame、FlowerCityFence、IceCreamBalls、KolyaandMovieTheatre和MagicWillSavetheWorld,涉及字符串查找、数组操作、动态规划和优化算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Codeforces Round 894 (Div. 3)

A. Gift Carpet

根据题意扫描每列找到“vika”即可

void solve(){
    cin >> n >> m;
    char mp[22][22];
    for(int i = 1;i <= n;i++)
        cin >> mp[i];
    string tp = " vika";
    int p = 1;
    for(int j = 0;j < m;j++){
        for(int i = 1;i <= n;i++){
            if(mp[i][j] == tp[p]){
                p++;
                break;
            }
        }
        if(p == 5){
            cout << "YES\n";
            return;
        }
    }
    cout << "NO\n";

}

B. Sequence Game

遍历b中每个数,若该数比前一个小,则在该数前插入1即可

void solve(){
    cin >> n;
    for(int i = 1;i <= n;i++) cin >> b[i];
    m = n;
    a[1] = b[1];
    for(int i = 2, j = 2;i <= n;i++, j++){
        if(b[i] < a[j-1]){
            a[j++] = 1;
            m++;
        }
        a[j] = b[i];
    }
    cout << m << '\n';
    for(int i = 1;i <= m;i++) cout << a[i] << ' ';
    cout << '\n';
}

C. Flower City Fence

模拟数组将翻转即可

void solve(){
    cin >> n;
    for(int i = 1;i <= n;i++) cin >> a[i];
    a[n+1] = 0;
    if(a[1] != n){
        cout << "NO\n";
        return;
    }
    int h = 1;
    for(int i = 1, j = a[1];i <= n;i++, h++){
        while(a[i] == a[i+1]){
            h++;
            i++;
        }
        while(j > a[i + 1]){
            b[j] = h;
            j--;
        }
    }
    b[1] = n;
    for(int i = 1;i <= n;i++){
        if(a[i] != b[i]){
            cout <<"NO\n";
            return;
        }
    }

    cout << "YES\n";
}

D. Ice Cream Balls

先找出最大的k,k*(k - 1) / 2 <= n

答案为k + n - (k * (k - 1) / 2)

void solve(){
    cin >> n;
    int l = 2, r = 2e9;
    while(l <= r){
        int mid = l + r >> 1;
        if((mid * (mid - 1)) / 2 > n) r = mid - 1;
        else l = mid + 1;
    }
	l--;
    int ans = l + (n - (l * (l - 1)) / 2);
    cout << ans << '\n';
}

E. Kolya and Movie Theatre

设看的最后一场电影是第bk场,总共降低的价值等于bk * d

求出每个位置作为最后一场时能选的最大m个数的和取最大即可

void solve(){
    cin >> n >> m >> d;
    for(int i = 1;i <= n;i++) cin >> a[i];
    priority_queue<int, vector<int>, greater<int>>q;
    int sum = 0, ans = 0;
    for(int i = 1;i <= n;i++){
        if(a[i] > 0) q.push(a[i]), sum += a[i];
        if(q.size() > m) sum -= q.top(), q.pop();
        ans = max(ans, sum - d * i);
    }
    cout << ans << '\n';
}

F. Magic Will Save the World

所有怪兽血量总和不超过1e6,直接01背包枚举所有可能出现的几个怪兽血量和 i i i,设水魔法消灭了i,火消灭了(sum - i),需要的时间为 m a x ( ⌈ i / w ⌉ , ⌈ ( s u m − i ) / f ⌉ ) max(\lceil i/w \rceil , \lceil (sum - i) / f \rceil ) max(⌈i/w,⌈(sumi)/f⌉)

void solve(){
    cin >> w >> f >> n;
    int sum = 0;
    for(int i = 1;i <= n;i++) cin >> a[i], sum += a[i];
    vector<int>dp(sum + 1, 0);
    dp[0] = 1;
    for(int i = 1;i <= n;i++){
        for(int j = sum;j >= a[i];j--){
            dp[j] |= dp[j - a[i]];
        }
    }
    int ans = sum;
    for(int i = 0;i <= sum;i++) if(dp[i]){
        ans = min(ans, max((i + w - 1) / w, (sum - i + f - 1) / f));
    }
    cout << ans << '\n';
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BowTen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值