题解 P5051 【[COCI2017-2018#7] Timovi】
SingularPoint
2020-08-21 18:57:46
看到楼上大佬们一堆优化证明......蒟蒻的我表示只会**模拟**而已啊QAQ
题目描述很简洁,就是~~迂回塞人~~给出n个小组,从头到尾向小组里放人,每次放k个人,如果放到队尾还有人没放完就从后向前再来一遍,以此类推。
这里就可以很简单的想到把两个方向分成两部分完成,正方向跑一遍,没跑完就反过来跑(废话)
但是毕竟是单纯的模拟,没有优化,所以 **本题解需要开O2**
分析结束,那么
### 开始我们的模拟罢
```cpp
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int l[200010];//小组
void go_back(int);//提前声明反方向操作
void go_on(int tot)//正方向跑
{
for(int i=1;i<=n;i++){
if(tot-k<=0){
l[i]+=tot;
return;
}
tot-=k;
l[i]+=k;
}
if(tot) go_back(tot);//如果人没放完就反方向跑
return;
}
void go_back(int tot)//反方向
{
for(int i=n-1;i>1;i--){//【注意】这里是从n-1到2,n和1在正方向中放过了,不能重复
if(tot-k<=0){
l[i]+=tot;
return;
}
tot-=k;
l[i]+=k;
}
if(tot) go_on(tot);//如果人没放完就正方向跑,如此达到迂回的效果
return;
}
int main()
{
scanf("%d%d%d",&n,&k,&m);
go_on(m);
for(int i=1;i<=n;i++)
printf("%d ",l[i]);
return 0;
}
```
**完结撒fa~**
(小声:蒟蒻第一次写题解求过!)