1. 程式人生 > 實用技巧 >【題解】[COCI2017-2018#7] Timovi

【題解】[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~