【题解】洛谷 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~