棧和隊列的綜合應用,利用棧和隊列分別模擬分,5分,時槽,以及小球隊列ios
利用求出一天後的置換能夠求出週期,進而求出最大公約數(能夠利用矩陣的角度,也許能夠簡化,由於每次都是乘上一個相同的置換矩陣)spa
要注意讀題,時槽 滿12歸隊的方式很不同code
#include <cstdio> #include <iostream> #include <algorithm> #include <stack> #include <queue> using namespace std; const int maxn= 127+5; const int dms= 24*60; int T[maxn], chg[maxn]; stack<int> h, fvm, m; queue<int> bl; int ans; int Gcd(int a, int b) { return 0== b? a : Gcd(b, a%b); } void Init(int n) { ans= 1; while (!bl.empty()){ bl.pop(); } while (!h.empty()){ h.pop(); } while (!fvm.empty()){ fvm.pop(); } while (!m.empty()){ m.pop(); } for (int i= 0; i< n; ++i){ T[i]= 1; } for (int i= 0; i< n; ++i){ bl.push(i); } } int main() { int n; while (1){ scanf("%d", &n); if (0== n){ break; } Init(n); for (int i= 0; i< dms; ++i){ int obl= bl.front(); bl.pop(); if (4== m.size()){ for (int j= 0; j< 4; ++j){ bl.push(m.top()); m.pop(); } if (11== fvm.size()){ for (int j= 0; j< 11; ++j){ bl.push(fvm.top()); fvm.pop(); } if (11== h.size()){ for (int j= 0; j< 11; ++j){ bl.push(h.top()); h.pop(); } bl.push(obl); }else{ h.push(obl); } } else{ fvm.push(obl); } } else{ m.push(obl); } } for (int i= 0; i< n; ++i){ chg[i]= bl.front(); // cout<<i<<" "<<chg[i]<<endl; bl.pop(); } for (int i= 0; i< n; ++i){ int ni= chg[i]; while (ni!= i){ ni= chg[ni]; ++T[i]; } } for (int i= 0; i< n; ++i){ ans= ans*T[i]/Gcd(ans, T[i]); } cout << n << " balls cycle after "<< ans<<" days."<<endl; } return 0; }