1 条题解

  • 0
    @ 2025-8-24 22:30:20

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar fengwu
    兄弟会背叛你,女人会离开你,金钱会诱惑你,JJB会嘲讽你,只有数学不会,不会就是不会,咋学都不会

    搬运于2025-08-24 22:30:20,当前版本为作者最后更新于2021-11-03 08:22:55,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    简单之至的题解

    比楼上的简单,代码只有二十行。

    首先看题的时候发现这个无法做到直接求。

    因为数据范围好像有点超乎想象。

    但是对于这种递推的题来说一般就是从小的往大的推。

    那么我们递推的过程就是每一次挽回。

    我们发现我们挽回一次之后问题就变成了一个子问题。

    但是这个子问题的挽回顺序变了,我们只需要在递推的时候反过来就好了。

    这个题又非常的善良给了我们当前这一行的最大值。

    明显的暗示递推好吧~~~。

    我们直接枚举当前的枫叶数量。

    计算挽回一次之后还剩下多少。

    用剩下的枫叶数目对应的答案,先翻转一下,在计算这个答案的位置之前拿走了多少叶子。

    直接加上就是答案。

    最后直接输出就好了。

    #include<bits/stdc++.h>
    using namespace std;
    #define fxt(i,x,y) for(int i=(x);i<=(y);i++)
    #define pyt(i,x,y) for(int i=(x);i>=(y);i--)
    const int N=1e6+5;
    int t,q,m,n,ans[N];
    signed main(){
        scanf("%d",&t);
        fxt(k,1,t){
            scanf("%d%d",&q,&m);
            ans[1]=1;
            fxt(i,2,m){
                int las=i-(i-1)/(k+1)-1;
                int pos=las-ans[las]+1;
                ans[i]=pos+(pos-1)/k+1;
            }
            while(q--){
                scanf("%d",&n);
                printf("%d ",ans[n]);
            }
            printf("\n");
        }
    }
    
    • 1

    信息

    ID
    6283
    时间
    1000ms
    内存
    128MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者