POJ 1879

棧和隊列的綜合應用,利用棧和隊列分別模擬分,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;
}
相關文章
相關標籤/搜索