思路:题目的意思大概是一个老板要雇佣工人,每个工人要工作n天后休息m天,而且每天必须保证工作的人数大于k,附加条件就是这个商店只有一把钥匙,工作的工人可以在工作时间把要是给另外一个人,以保证每天都有需要工作的人拿着钥匙开门。
把题目理解完了之后,就明白这是一道模拟题目,首先要保证每天工作人数达到k,从第一天开始模拟,那么第一天直达第n天都是要求k个人来工作,人后看n+1天,这天工作人数为0,所以没人有要是来开门,即使你在这天雇佣工人也不行,所以 要返回到第n天,这天来雇佣一人拿钥匙,然后再模拟第n+1天,要求其人数达到k,依次类推,知道模拟到n+m+1天,那么就会形成一个循环,后面的情况就不用再考虑了。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int s[4000],t[4000];
int main()
{
int m,n,K;
while(scanf("%d%d%d",&m,&n,&K)!=-1)
{
memset(t,0,sizeof(t));
memset(s,0,sizeof(s));
int mn=m+n;
int p=mn;
int i,j,k=0;
while(t[1]<K)
{
s[k++]=1,t[1]++;
}
for(j=2; j<=p+1; j++)
if((j-1)%mn<m) t[j]=t[1];
for(i=2; i<=p; i++)
{
int flag=0;
if(t[i]==0)
{
i--;
flag++;
t[i]++;
s[k++]=i;
}
while(t[i]<K)
{
s[k++]=i,t[i]++;
flag++;
}
if(flag)
for(j=i+1; j<=p+1; j++)
if((j-i)%mn<m) t[j]+=flag;
}
if(t[p+1]==t[1]) s[k++]=p;
printf("%d\n%d",k,s[0]);
for(i=1; i<k; i++)
printf(" %d",s[i]);
printf("\n");
}
return 0;
}
codeforces 216C-Hiring Staff,布布扣,bubuko.com
原文:http://blog.csdn.net/knight_kaka/article/details/21182587