每次能走n-1步就走n-1步,走不了就前后来回走,最后一次把剩下没走完的走完
#include<bits/stdc++.h> using namespace std; typedef long long ll; int main() { ll n,k,s; scanf("%lld%lld%lld",&n,&k,&s); if(k>s||(n-1)*k<s) { printf("NO\n"); return 0; } else { printf("YES\n"); int flag=1; while(s-(n-1)>=k-1&&k>0) { //printf("%d %d\n",s,k); s-=(n-1); k--; if(flag==1) { printf("%d ",n); } else { printf("1 "); } flag^=1; } if(s==0) { printf("\n"); return 0; } if(flag==0) { int now=n; while(k>1) { if(flag==0) { printf("%d ",n-1); now=n-1; } else { printf("%d ",n); now=n; } flag^=1; k--; s--; } printf("%d\n",now-s); } else { int now=1; while(k>1) { if(flag==1) { printf("%d ",2); now=2; } else { printf("%d ",1); now=1; } flag^=1; k--; s--; } printf("%d\n",now+s); } } }
还有一种很简单的方式,每次走n-1和s-k+1的较小值
#include <bits/stdc++.h> using namespace std; int main(){ long long n, k, s; cin >> n >> k >> s; if(s<k || s>(n-1)*k){ cout << "NO" << endl; return 0; } cout << "YES" << endl; int st=1; while(k--){ int rm=min(s-k, n-1); s-=rm; if(st+rm<=n) st+=rm; else st-=rm; cout << st << " "; } cout << endl; }