zoukankan      html  css  js  c++  java
  • UVA 10273

    我是用暴力过的,虽然网上说刘汝佳出的这道题考的是堆,我不太懂,。。用暴力时间复杂度高一些,但是一样能过

    所要注意的就是周期问题,因为只要同时存在某一天超过一头牛产奶量最小,就不会杀牛,而每头牛的周期和每天产奶量都不一样,我一开始用周期最长的做指标,如果超过这个指标还没有牛被杀,说明状态稳定,输出。。。但是这样是WA的。。。

    正确的周期应该是所有牛的周期的最小公倍数(也可以超过最小公倍数,但无疑最小公倍数是最优的),这也给了我一些新启发,周期不同的时候把所有可能性都走完,就是最小公倍数

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    struct node
    {
        int d[15];
        int t,cnt;
    } cow[1010];
    int gcd(int a,int b)
    {
        if (b==0) return a;
        else
            return gcd(b,a%b);
    }
    int eat[1010];
    int n,maxn,day,ans;
    void solve()
    {
        ans=day=0;
        int cur=0;
        while (1)
        {
            int mini=1<<30,loc,counts=0;
            for (int i=1; i<=n; i++)
            {
                if (eat[i]) continue;
                if (cow[i].d[cow[i].cnt]<mini)
                {
                    mini=cow[i].d[cow[i].cnt];
                    loc=i;
                    counts=1;
                }
                else if (cow[i].d[cow[i].cnt]==mini)
                {
                    counts++;
                }
                cow[i].cnt=(cow[i].cnt+1)%cow[i].t;
            }
            day++;
            cur++;
            //cout<<day<<" "<<loc<<endl;
            //cout<<"maxn "<<maxn<<endl;
            if (counts==1)
            {
                eat[loc]=1;
                cur=0;
                ans=day;
            }
            else if (cur>maxn) break;
        }
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while (t--)
        {
            scanf("%d",&n);
            maxn=1;
            for (int i=1; i<=n; i++)
            {
                scanf("%d",&cow[i].t);
                eat[i]=0;
                cow[i].cnt=0;
                for (int j=0; j<cow[i].t; j++)
                    scanf("%d",&cow[i].d[j]);
                if (maxn<cow[i].t)
                    {
                        int temp;
                        temp=gcd(cow[i].t,maxn);
                        maxn=maxn*cow[i].t/temp;
                    }
                    else
                    {
                        int temp;
                        temp=gcd(maxn,cow[i].t);
                        maxn=maxn*cow[i].t/temp;
                    }
            }
            //out<<maxn<<endl;
            solve();
            int num=0;
            for (int i=1; i<=n; i++)
            {
                if (!eat[i]) num++;
            }
            printf("%d %d
    ",num,ans);
        }
        return 0;
    }
  • 相关阅读:
    terminal
    变量提升、函数提升
    ssh传输文件
    mocha测试框架
    npm-run 自动化
    webpack
    浅析babel
    构建工具gulp
    C++中TRACE宏及assert()函数的使用
    memcpy函数-C语言
  • 原文地址:https://www.cnblogs.com/kkrisen/p/3527295.html
Copyright © 2011-2022 走看看