CF 216C. Hiring Staff 构造

题意:若在第x天召唤一个守卫,则该守卫会连续工作n天,然后休息m天.重复以上规律.
要求每天至少要有k个守卫,并且至少有一个守卫是来自前一天工作的.
n,m,k<=1e3. 输出符合要求的解:res[i] 表示第i个人是在第res[i]天召唤的.


从x%(n+m)角度来考虑.每个人开始工作的时间为x,x+n+m,..x+k(n+m)
第一天必须要k个人.那么x%(n+m)=1,2,3....n的天数一定有k个人工作.


那么为了使第n+1天也有k个人.可以安排1个人在第n天,k-1个人在第n+1天.
因为n>=m,这样安排使得x%(n+m)=n,n+1,..n+n-1.都有k个人工作. 
若m<n 那么n+m-1<n+n-1 第一批人的上班时间在第二批人工作的最后一天之前.

若m==n n+n-1==n+m-1 第二批人最后一天在第一批上班的前一天. 那么需要在安排一个即可.

#include <bits/stdc++.h>
using namespace std;
const int N=3e3+5;
int n,m,k;
vector<int> v;
void print()
{
	cout<<v.size()<<'\n';
	for(int i=0;i<v.size();i++)
		cout<<v[i]<<' ';
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>m>>k; 
	if(k==1)
	{
		for(int p=1;p<=n+m;p+=n-1)
			v.push_back(p);
		print();
		return 0;
	}
	for(int i=1;i<=k;i++)
		v.push_back(1);	
	v.push_back(n);
	for(int i=2;i<=k;i++)
		v.push_back(n+1);
	if(n==m)
		v.push_back(n+2);
	print();
	return 0;
}


猜你喜欢

转载自blog.csdn.net/noone0/article/details/80230792