【模擬】【環形陣列】-UVA-133- The Dole Queue
阿新 • • 發佈:2018-12-26
題目描述:
1~N個人站成圈,公務猿 A 從1 開始順時針查過 k 個人,公務猿 B 從N開始逆時針查過 m 個人,他倆查出的人出列(可以是重複的同一個人),把每次出列的人輸出來,直到佇列中木有人。
解題思路:
看完題就想起了之前例會上學長講的陣列模擬queue功能的方法——迴圈陣列,就是用求餘運算來實現,這道題也算是比較簡單的。按想法寫出來就AC了。
AC程式碼:
#include <cstdio> #include <iostream> #include <cstring> using namespace std; int arr_1[500],arr_2[500]; bool use[30]; void reset(int n) { memset(arr_1,0,sizeof(arr_1)); memset(arr_2,0,sizeof(arr_2)); memset(use,0,sizeof(use)); int i,j; for(i=1;i<=n;i++) { arr_1[i]=i; } for(i=1,j=n;i<=n;i++) { arr_2[i]=j--; } } void solve(int N,int k,int m) { int found,p1,p2,c1,c2,i; p1=1;p2=1; found=0; while(found<N) { c1=0;c2=0; for(;;p1++) { if(!use[arr_1[p1]]) c1++; if(c1==k) { found++; break; } if(p1==N) p1=0; } for(;;p2++) { if(!use[arr_2[p2]]) c2++; if(c2==m) { if(arr_2[p2]!=arr_1[p1]) found++; break; } if(p2==N) p2=0; } use[arr_1[p1]]=1; use[arr_2[p2]]=1; if(arr_1[p1]!=arr_2[p2]) printf("%3d%3d",arr_1[p1],arr_2[p2]); else printf("%3d",arr_1[p1]); if(found<N) printf(","); } printf("\n"); } int main() { int N,k,m; while(scanf("%d%d%d",&N,&k,&m),N||k||m) { reset(N); solve(N,k,m); } return 0; }
AC截圖: