CF1015D题解

· · 题解

思路

因为要走满 k 次,所以咱们就可以求出他能移动的最少距离和最多距离。

如果要走的步数不在这个区间中,就说明不可能走够,就输出"NO"。 然后,就要去确定每步走多远。于是,我们可以算一下平均数(向下取整),再算一下余数。余数代表有多少个数要比平均数(向下取整)多走一步。

设平均数(向下取整)为 n,那么第一步走到 1+n ,第二步回到1,以此类推。

注意

要先枚举多走一步的,要不然可能会越界。

代码

#include<bits/stdc++.h>
#define int long long//n*m会爆int
using namespace std;
int n,m,k,f=1;
signed main()
{
    cin>>n>>m>>k;
    if((n-1)*m<k||m>k)//不处于这个区间中
    {
        cout<<"NO\n";
        return 0;
    }
    cout<<"YES\n";
    int c=k/m,cy=k%m;
    for(int i=1;i<=cy;i++)//处理多走一步的
    {
        if(i%2==1)//往前走
        {
            cout<<c+2<<' ';
            f=c+2;
            continue;
        }
        //回到1
        cout<<1<<' ';
        f=1;
    }
    for(int i=cy+1;i<=m;i++)//不多走一步的
    {
        if(i%2==1)//往前走
        {
            cout<<f+c<<' ';
            f+=c;
            continue;
        }
        //回到1
        cout<<f-c<<' ';
        f-=c;
    }
    return 0;
}