「杂题乱刷2」CF1015D Walking Between Houses

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;
}
posted @ 2024-07-15 20:45  wangmarui  阅读(5)  评论(0编辑  收藏  举报