题意:若在第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 第一批人的上班时间在第二批人工作的最后一天之前.
要求每天至少要有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; }