题解 P5051 【[COCI2017-2018#7] Timovi】

SingularPoint

2020-08-21 18:57:46

Solution

看到楼上大佬们一堆优化证明......蒟蒻的我表示只会**模拟**而已啊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~** (小声:蒟蒻第一次写题解求过!)