1 条题解

  • 0
    @ 2025-8-24 22:06:36

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Alex_Wei
    **

    搬运于2025-08-24 22:06:36,当前版本为作者最后更新于2019-01-17 21:58:23,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    思路:把来回一趟看做一个整体

    1,2,3n,n14,3,21,2,3……n,n-1……4,3,2(注意这里是 22

    共放了 2(n1)2*(n-1) 次,共 2(n1)k2*(n-1)*k

    计算出趟数 tt,再模拟剩下来的人数

    趟数=总人数/来回一趟的人数,即

    t=m/(2(n1)k)t=m/(2*(n-1)*k)

    剩余人数=总人数%来回一趟的人数,再模拟下去即可

    时间复杂度:O(n)O(n)

    具体思路见代码

    #include<bits/stdc++.h>
    using namespace std;
    long long i[200020],n,m,k,t,no=1,pd=1;
    int main()
    {
    	cin>>n>>k>>m; 
    	t=m/(k*(n-1)*2);//趟数=总人数/来回一趟的人数
    	for(int x=1;x<=n;x++)
    		x==1||x==n?i[x]=t*k:i[x]=t*k*2;//每个队伍的人数=趟数(t)*每趟的人数(k*2),注意这里的1和n要特判一下
    	m%=(k*(n-1)*2);//剩余的人数
    	for(int x=1;m;x++){//还有人没有被分配在队伍里
    		int p=n-abs(n-x),pe=min(m,k);//p:即将把人分配到第p个队伍里(这个计算公式可以手推),pe:可以分配的人数 
    		i[p]+=pe,m-=pe;
    	}
    	for(int x=1;x<=n;x++)
    		cout<<i[x]<<" ";
    	return 0;
    }
    

    如果有错误请私信我,我会及时改正!

    UPD 2019.8.17 : 修改部分文字,添加Latex\small{\text{UPD 2019.8.17 : 修改部分文字,添加Latex}}

    • 1

    信息

    ID
    4058
    时间
    1000ms
    内存
    63MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者