Codeforces Round #501 D. Walking Between Houses 构造

题意:

给定n,k,s:有1-n个点可以落脚,开始在1点,然后走k步,是否可以使行走路径长度达到s,可以则输出路径

思路:

行走的路径没有限制,不超过n就行,所以我们首先检查是否合法

如果 (n-1)*k  < s 或者 k > s 则不合法

然后每次都走 s/k 步就可以了,其实这么说有错误, 若 cnt = s%k > 0 那么就要有cnt次多走一步,这样比较简单

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, k, s;

int main() {
    cin >> n >> k >> s;
    ll t = (s/k) + (s%k == 0?0:1);
    if(t >= n || s < k) {
        cout << "NO"; return 0;
    }
    cout << "YES" << endl;
    if(s%k == 0) {
        ll c = 1;
        for(int i = 1; i <= k; ++i) {
            c += t;
            printf("%lld%c", c, (i == k ? '\n':' '));
            t = -t;
        }
    }
    else {
        ll cnt = (s%k);
        ll c = 1;
        int i;
        for(i = 1; i <= cnt; ++i) {
            c += (t);
            printf("%lld%c", c, (i == k ? '\n':' '));
            t = -t;
        }
        int tt = s/k;
        if(c != 1) {
            tt =-tt;
        }
        for( ; i <= k; ++i) {
            c += tt;
            printf("%lld%c", c, (i == k ? '\n':' '));
            tt = -tt;
        }
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/xiang_6/article/details/81503063