题解 | 小A弹吉他

小A弹吉他

https://www.nowcoder.com/practice/1ea8f581cc1a4db9b098faf82a7b0850

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define dbg(x) cout<<#x<<": "<<x<<endl;
#define endl '\n'
#define int long long
const int N=1e7+1e5;
vector<int> f;
void init(){
    f=vector<int>(N);
    int pref=0;
    for(int i=1;i<N;i++){
        f[i]=f[i-1]+pref+i;
        pref+=i;
    }
}
void solve(){
    int m;cin>>m;
    auto ele=upper_bound(f.begin(),f.end(),m);
    cout<<ele-f.begin()<<endl;
}
signed main(){
    IOS;
    int t=1;
    cin>>t;
    init();
    while(t--)solve();
    return 0;
}

可以发现如果我们应该尽量让最大的数出现的次数最小,这样组成的数就能尽可能的大,然后我们发现每个数的出现次数呈现从左往右阶梯状下降,若此时数组的和为 sum 此时只要我们增大最大的数就可以将大于等于sum的m全部取到,因此我们想到二分的判断mex即可,但问题是我们不知道怎么求这个阶梯状数组的和,所以我们可以尝试预处理这个数组,如图

全部评论

相关推荐

03-02 08:18
集美大学 Java
钱嘛数字而已:没有赛事奖项么?另外,项目经历字有点多哈,建议突出一下重点:用的什么技术,解决什么问题,达到什么效果。
大家都开始春招面试了吗
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务