2023牛客寒假算法基础集训营5 I—小沙の金银阁

题目描述:

小沙开设了金银阁娱乐场所,前去邀请小雅来游玩。

金银阁的规则是:每轮游戏开始之前需要压下一定的灵石(玩家指定,但不得超过自身所带的灵石上限),如果失败,则输掉该轮压的所有灵石,如果获胜则获得该轮所压灵石数以及本金。

小雅带来了 m 块灵石,这时有一位预言家告诉小雅,你接下来参加的 n 场比赛,仅有一场能够押对赚灵石,其它的 n−1 场均会输掉灵石。现需要小雅设计她的方案,当她获胜之后,她就会卷灵石跑路(因为显然接下来每局是必输的)。小雅想请你帮她设计最优的赚灵石方案。

你需要保证,小雅每场所压灵石数均为正整数

在能必定不会亏灵石的条件下(你可以玩完n轮下来,一分钱没赚),对于任意的另一个方案,在第 X 轮获胜的时候,前 X−1 轮,每轮结束之后剩余灵石相同,第 X 轮获胜时总灵石越多,则该方案优于其它方案。

例如:

比赛轮数为 3 ,灵石数为 11 。
方案1为: 2 , 3 , 6 。
方案2为: 2 , 2 , 7 。
则方案 1 更优,因为方案 1 第 222 轮获胜之后,有 12 个灵石,方案 2 ,第二轮获胜只拥有 11 个灵石。

输入描述:

第一行输入两个整数,n,m,其中 n 代表比赛的轮数,m 代表小雅带来的灵石数,1≤n≤10^5,1≤m≤10^15。

输出描述:

输出 nnn 个正整数,并保证他们的和不超过 mmm ,如果没有方案能够赚取灵石,输出一个 -1 。

示例1

输入

3 11

输出

2 3 6

思路:

保证后面的每一个数都大于前面所有的数的和。

代码:

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;
typedef double db;

ll s[100005];

int main() {
    std::ios::sync_with_stdio(false);
    ll n,m;
    cin>>n>>m;
    s[n]=m;
    for(int i=n-1;i>=1;i--){
        s[i]=s[i+1]/2;
        s[i+1]=s[i+1]-s[i];
        if(s[i]==0){
            cout<<-1;
            return 0;
            }
    }
    for(int i=1;i<=n;i++){
        cout<<s[i]<<' ';
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值