我是靠谱客的博主 欣慰心情,最近开发中收集的这篇文章主要介绍CodeForces 1453 D. CheckpointsCodeForces 1453 D. Checkpoints,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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 题还没过,很烦躁。。。

最后

以上就是欣慰心情为你收集整理的CodeForces 1453 D. CheckpointsCodeForces 1453 D. Checkpoints的全部内容,希望文章能够帮你解决CodeForces 1453 D. CheckpointsCodeForces 1453 D. Checkpoints所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部