Hihocoder #1631 : Cats and Fish 模拟

题意

现有n个鱼 m个猫 每条猫有吃一条鱼所要花去的时间
问最终x分钟后会有多少只完整的鱼 和不完整的鱼

分析

很像操作系统的资源调度的问题
这种卡时间点的问题向来都要好好把
每个步骤所发生的时间给他具体化
我们看每只猫吃一条鱼花去ci分钟 而他是在这一分钟开始的时刻开始吃的
放到时间轴里就是 0-1-2-3-4-… 、
定义时间点表示在ti分钟之后
所有猫在0时刻开始的时间点申请吃鱼
然后在第ci分钟处吃完 假如这只猫吃一条鱼花3分钟 那么他应该在2,3交界的位置把完成吃完这条鱼
如果把时间轴用循环模拟 应该在循环变量为2的时候完成吃完 那么当第3分钟开始时 也就是3分钟以后
开始申请吃下一条鱼
那么所有的过程模拟下来就是
从开始吃 鱼–不完整的鱼的数量++
吃完的时候 不完整的鱼–
过了下一整点 再开始吃 鱼– 不完整鱼数量++
那么关于如何模拟吃和完成吃的过程
申请吃可以用个堆 优先选择吃的快的
完成吃就可以放到一个完成吃的队列里搞搞

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main()
{
    int m,n,x;
    while(~scanf("%d%d%d",&n,&m,&x))
    {
        int y=0;
        priority_queue<int,vector<int>,greater<int> >eat[3002];
        vector<int>fis[3003];
        for(int i=1;i<=m;i++){
            int t;
            scanf("%d",&t);
            eat[0].push(t);
        }
        for(int t=0;t!=x;t++){
            //当前分钟 吃的过程
            while(!eat[t].empty()){
                int to = eat[t].top();//得到此刻申请资源的猫 以及他的速度
                eat[t].pop();
                if(n>0){
                    n--,y++;//吃了 把余++
                    if(to==1)fis[t].push_back(to);//设定完成时间
                    else fis[t+to-1].push_back(to);//这里不是+to时间 而是在+to和上一分钟的交界处完成 我们把他分给上一分钟
                }
            }
            //当前分钟 吃完成的过程 fis为当前分钟末尾处理
            for(int i=0;i<fis[t].size();i++){
                int f = fis[t][i];//当前的鱼吃完了
                y--;//吃完了后要接着吃 不过是下一分钟开始的时候吃
                eat[t+1].push(f);
            }
            //一个i代表 一个完整的分钟
        }
        printf("%d %d\n",n,y);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值