题目链接:http://codeforces.com/contest/1015/problem/D
题意:给了1-n这n个位置,从1开始走,每次必须走到相对于当前位置的另外一个位置,问是否可以用k步走s的距离,每次走的距离为|pos1-pos2|(pos1为原位置,pos2为走到的位置)
分析:坑爹的大模拟。先贪心地走尽可能远的位置,我直接选取了左右两边,每次走n-1步,假设有x个这样的走法,剩下走了y步。可以得到x + y = k , x * (n - 1) + d = s 。x = (s - k) / (n - 2)。但是s-k不一定能被n-2整除呀,但是整数部分就是一定要走的了,不能整除的话会多出来不超过n-2的步子,y不为0的话我们就抽出一步走多余的步子,剩下的一步一步走就好啦。这里我分三种情况讨论,分别是x=0,y=0,x,y均不为0的情况。注意n=2要单独讨论一下。不满足的情况就是k太小或者s太大。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 10;
ll res[maxn];
int main()
{
ll n,k,s;
cin>>n>>k>>s;
if(k > s)
{
printf("NO\n");
return 0;
}
if(s % (n - 1) == 0 && (s / (n - 1)) > k)
{
printf("NO\n");
return 0;
}
if(s % (n - 1) != 0 && (s / (n - 1) + 1) > k)
{
printf("NO\n");
return 0;
}
ll x = (s - k) / (n - 2),len;
printf("YES\n");
if(n == 2)
{
ll cnt = 0,pos = 2;
int flag = 0;
while(cnt < k)
{
res[++cnt] = pos;
if(!flag)
pos++;
else
pos--;
if(pos == n + 1)
{
pos = n - 1;
flag = !flag;
}
else if(pos == 0)
{
pos = 2;
flag = !flag;
}
}
len = cnt;
}
else
{
ll y = k - x;
//printf("%I64d %I64d %I64d\n",x,y,jump);
for(ll i = 1; i <= x; i++)
{
if(i % 2)res[i] = n;
else res[i] = 1;
}
if(x == 0)
{
y--;
ll jump = s - x * (n - 1) - y;
res[1] = 1 + jump;
ll cnt = x + 1,pos = jump;
int flag = 0;
while(cnt - x - 1 < y)
{
res[++cnt] = pos;
if(!flag)
pos--;
else
pos++;
if(pos == n + 1)
{
pos = n - 1;
flag = !flag;
}
else if(pos == 0)
{
pos = 2;
flag = !flag;
}
}
len = cnt;
}
else if(y == 0)
{
for(ll i = 1; i <= x; i++)
{
if(i % 2)res[i] = n;
else res[i] = 1;
}
len = x;
}
else
{
y--;
ll jump = s - x * (n - 1) - y;
if(res[x] == 1)
{
res[x + 1] = 1 + jump;
ll cnt = x + 1,pos = jump;
int flag = 0;
while(cnt - x - 1 < y)
{
res[++cnt] = pos;
if(!flag)
pos--;
else
pos++;
if(pos == n + 1)
{
pos = n - 1;
flag = !flag;
}
else if(pos == 0)
{
pos = 2;
flag = !flag;
}
}
len = cnt;
}
else
{
res[x + 1] = n - jump;
ll cnt = x + 1,pos = n - jump + 1;
int flag = 0;
while(cnt - x - 1 < y)
{
res[++cnt] = pos;
if(!flag)
pos++;
else
pos--;
if(pos == 0)
{
pos = 2;
flag = !flag;
}
else if(pos == n + 1)
{
pos = n - 1;
flag = !flag;
}
}
len = cnt;
}
}
}
for(ll i = 1; i <= len; i++)
{
if(i == 1)printf("%I64d",res[i]);
else printf(" %I64d",res[i]);
}
printf("\n");
return 0;
}