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

题目传送门 -> https://www.luogu.com.cn/problem/P5051

正片

看完题目,蒟蒻的我表示只会模拟而已啊QAQ

题目描述很简洁,就是~~迂回塞人~~给出n个小组,从头到尾向小组里放人,每次放k个人,如果放到队尾还有人没放完就从后向前再来一遍,以此类推。

这里就可以很简单的想到把两个方向分成两部分完成,正方向跑一遍,没跑完就反过来跑(废话)

但是毕竟是单纯的模拟,没有优化,所以 本题解需要开O2

分析结束,那么

开始我们的模拟罢

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,k;
 4 int l[200010];//小组 
 5 void go_back(int);//提前声明反方向操作 
 6 void go_on(int tot)//正方向跑 
 7 {
 8     for(int i=1;i<=n;i++){
 9         if(tot-k<=0){
10             l[i]+=tot;
11             return;
12         }
13         tot-=k;
14         l[i]+=k;
15     }
16     if(tot) go_back(tot);//如果人没放完就反方向跑 
17     return;
18 }
19 void go_back(int tot)//反方向 
20 {
21     for(int i=n-1;i>1;i--){//【注意】这里是从n-1到2,n和1在正方向中放过了,不能重复 
22         if(tot-k<=0){
23             l[i]+=tot;
24             return;
25         }
26         tot-=k;
27         l[i]+=k;
28     }
29     if(tot) go_on(tot);//如果人没放完就正方向跑,如此达到迂回的效果 
30     return;
31 }
32 int main()
33 {
34     scanf("%d%d%d",&n,&k,&m);
35     go_on(m);
36     for(int i=1;i<=n;i++)
37         printf("%d ",l[i]);
38     return 0;
39 }

完结撒fa~

posted @ 2020-08-21 19:05  SingularPoint  阅读(208)  评论(1编辑  收藏  举报