题目连接:
http://acm.hdu.edu.cn/showproblem.php?pid=4519
方法:模拟,如果员工人数小于等于医生人数,则有多少检查项目就需要多少分钟,否则,设有m个医生,则在员工中的前m个的一项先被m个医生并行检查,这样耗去1分钟,然后移动到后m个,依次平移,当后面所剩余的员工不够m时,开始不够的那个员工边重新定位到开始位置,这样,多次迭代,总是最开始检查的员工完成检查,这样前面的员工边不再检查,就要为每次回绕的时候设置新的开始位置,直到开始位置大于员工数量。
代码:
#include<iostream> #include<queue> #include<map> #include<string> #include <algorithm> using namespace std; int const MAX =100001; int main() { int n,k,m,tc; scanf("%d",&tc); while(tc>0) { scanf("%d %d %d",&n,&k,&m); if(n<=m) cout<<k<<endl; else { int nums[101]; memset(nums,0,sizeof(nums)); int start = 1; int re =0; int j=0; for(int i=start;start<=n;i++) { j++; if(j%m==0) { re++; j=0; } if(i>n) i=start; nums[i]++; if(nums[i]==k) start++; } if(j!=0) re++; cout<<re<<endl; } tc--; } return 0; }
感想:推不出数学公式。。