1. 程式人生 > >Cats and Fish HihoCoder - 1631

Cats and Fish HihoCoder - 1631

Cats and Fish

 HihoCoder - 1631

題意:

有一些貓和一些魚,每隻貓有固定的吃魚速度,吃的快的貓優先選擇吃魚,問在x秒時有多少完整的魚和有多少貓正在吃魚?

題解:

模擬一下。兩層迴圈模擬在每一秒時,每個貓的狀態是什麼樣子的,如果在這一秒這個貓沒有吃魚,而魚還有剩餘,那麼就給貓吃,如果當前t秒是貓吃魚速度的倍數,就說明這個貓剛好吃完,又可以給她魚吃了。

#include <bits/stdc++.h>
using namespace std;
struct node
{
    int f;  // f當前是否有魚吃 v是吃魚的速度
    int v;
} s[1005];
bool cmp(struct node a,struct node b)
{
    return a.v < b.v;
}
int main()
{
    int n,m,x;
    while(~scanf("%d %d %d", &m, &n, &x))
    {
        for(int i = 1; i <= n; i ++)
        {
            scanf("%d",&s[i].v);
            s[i].f = 0;
        }
        sort(s + 1, s + 1 + n, cmp);
        int sum1 = m, sum2 = 0;
        for(int i = 0; i <= x; i ++)
        {
            for(int j = 1; j <= n; j ++)
            {
                if(i % s[j].v == 0)   // 如果當前是這個貓的吃魚的速度的倍數,那麼肯定能夠給ta吃。
                    s[j].f = 0;
                if(sum1 <= 0)   // 如果沒有魚了,就不用繼續了
                    continue;
                else           // 否則,當前這隻沒有魚吃的貓會選擇一條魚吃
                {
                    if(s[j].f == 0 && i != x)   // i是從0開始
                    {
                        s[j].f = 1;
                        sum1--;
                    }
                }
            }
        }
        for(int j = 1; j <= n; j ++)   // 還有標記的貓就是正在第x秒在吃魚的啦
        {
            if(s[j].f == 1)
                sum2 ++;
        }
        printf("%d %d\n",sum1,sum2);
    }
    return 0;
}