CodeForces 1453 D. Checkpoints

这篇博客介绍了CodeForces 1453 D. Checkpoints的问题。题目要求构造一个序列,其中1表示存档点,目标是使所有关卡的期望值等于给定的k,每个关卡的通过率为21%。博主分享了解题思路,指出关键在于理解1前面0的数量对期望值的影响,并提供了实现代码。最后,博主提到由于忽视了首个关卡必须为1的条件导致了错误,并表达了因C题未过而产生的烦躁情绪。

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

CodeForces 1453 D. Checkpoints

题目大意:

构造一个序列, 1 1 1 就是当前关卡的存档点, 0 0 0就不是, 给一个 k k k, 怎么构造关卡序列使得所有关卡的期望等于 k k k, 每个关卡的通过率是 1 2 \frac 1 2 21

思路:

思考后发现: 1 1 1 的关卡的期望一定是 2 2 2,问题就在 0001 0001 0001 这种上面,在 1 1 1 这个关卡上一定要 2 2 2 次,那 1 1 1 前面的 0 0 0 就要 4 4 4 次,因为 4 4 4 次机会才会有两次机会通过,这两次机会才能通过后面的 1 1 1,所以不难发现规律

那事情就简单了,就按着这样一直去减即可,要注意题目规定了第一个关卡必须是 1 1 1

每个关卡的期望贡献都是偶数,所以和一定是偶数,那奇数就是 − 1 -1 1

代码:

#include <bits/stdc++.h>
using namespace std;
#define me(a, b) memset(a, b, sizeof(a))
#define IOS() ios::sync_with_stdio(false), cin.tie(0)
#define endl '\n'

typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
const int maxn = 2e5 + 5;
const ll mod = 1e9 + 7;

void solve()
{
    ll k;
    cin >> k;
    if(k & 1) {
        cout << -1 << endl;
        return ;
    }
    vector<int> ans;
    k -= 2;
    while(k) {
        ans.push_back(1);
        k -= 2;
        for(ll i = 4; i <= k; i <<= 1) {
            ans.push_back(0);
            k -= i;
        }
    }
    ans.push_back(1);
    reverse(ans.begin(), ans.end());
    
    cout << ans.size() << endl;
    for(int & i : ans)
        cout << i << " ";
    cout << endl;
}

int main()
{
    IOS();
    int T;
    cin >> T;
    while(T--) {
        solve();
    }
    
    
    return 0;
}

总结:

因为没注意题目规定第一个关卡必须是 1,导致wa1 两次,而且因为 C 题还没过,很烦躁。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值