题目描述:
小沙开设了金银阁娱乐场所,前去邀请小雅来游玩。
金银阁的规则是:每轮游戏开始之前需要压下一定的灵石(玩家指定,但不得超过自身所带的灵石上限),如果失败,则输掉该轮压的所有灵石,如果获胜则获得该轮所压灵石数以及本金。
小雅带来了 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;
}