解题记录 codeforce div2 876

比赛地址Dashboard - Codeforces Round 876 (Div. 2) - Codeforces

A.有一个0 1序列 对于每个下标i,前i个位置和后i个位置必须有[i/k](上取整个数是1) 问1的最小数量。

显然 第一个和最后一个必须是1

那么我们考虑前n-1 个 保证每k个有一个就结束了

反正推导 后n-1个 也是同理 发现 没有区别

ans=ceil((n-1)/k)+1;

B.每个灯有2个属性 a和b 一开始灯全灭 你可以选择一个灯打开 你会获得b个积分 同时进行一次判断 如果你已经打开的灯的数量x 和灯的属性 存在a≤x的关系 所有属性a相同的灯就坏了 你不能再打开它 你需要找到最多的积分

这道题思路比较简单 但题目比较绕 即每个属性为a的灯你最多获得a个 那么每层让他获得a个就好了 不足a是最好的结果 下一层炸了没关系

for (int i = 1; i <= n; i++)
    {
        int a, b;
        cin >> a >> b;
        mp[a].emplace_back(b);
    }

long long res = 0;
for (auto &[i, vec]: mp)
    {
        sort(vec.begin(), vec.end());

        for (int j = vec.size() - 1, cnt = 1; j >= 0 && cnt <= i; j--, cnt++)
            {
                res += vec[j];
            }
    }

cout << res << endl;

}

C.直觉上 从后往前做 不细说了上code

    for (int i = 1; i <= n; i++)
            cin >> a[i];
 
        if (a[n] == 1)
        {
            cout << "NO" << endl;
            continue;
        }
        cout << "YES" << endl;
        int cnt = 0;
        for (int i = n; i; i--)
        {
            if (a[i]) cnt++;
 
            if (a[i] && a[i - 1] == 0)
                cout << cnt << " ", cnt = 0;
            else
                cout << 0 << " ";
        }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

逢时976

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

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

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

打赏作者

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

抵扣说明:

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

余额充值