duel 到的。
题目链接
CF1015D Walking Between Houses
解题思路
一道细节题。
思路很简单,肯定是一开始能走的越多越好,因此就有一种较好实现的方案,先每次走 \(n - 1\) 格,但由于每次至少要走一格,因此如果不够走了就把能走的都走掉,之后全走 \(1\) 步即可。
时间复杂度 \(O(k)\)。
参考代码
#include<bits/stdc++.h>
using namespace std;
#define re register
#define ll long long
#define forl(i,a,b) for(re ll i=a;i<=b;i++)
#define forr(i,a,b) for(re ll i=a;i>=b;i--)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
#define QwQ return 0;
#define cfy cout<<"YES\n";
#define cfn cout<<"NO\n";
ll t;
ll n,m,k;
ll now,pd;
void solve()
{
cin>>n>>m>>k;
if(k<m || k>(n-1)*m)
{
cfn;
return ;
}
cfy;
now=1;
while(m)
{
m--;
if(pd==1)
{
if(now==1)
cout<<++now<<' ';
else
cout<<--now<<' ';
continue;
}
k-=n-1;
if(k<m)
{
k+=n-1;
ll sum=k-m;
if(now==1)
cout<<now+sum<<' ',now+=sum,pd=1;
else
cout<<now-sum<<' ',now-=sum,pd=1;
}
else
{
if(now==1)
cout<<n<<' ',now=n;
else
cout<<1<<' ',now=1;
}
}
}
int main()
{
IOS;
t=1;
// cin>>t;
while(t--)
solve();
QwQ;
}
标签:Walking,cout,CF1015D,Houses,Between,杂题,define
From: https://www.cnblogs.com/wangmarui/p/18303945