Hihocoder #1631 : Cats and Fish 模拟

来源:互联网 发布:淘宝女装销售排行榜 编辑:程序博客网 时间:2024/05/10 21:27

题意

现有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;}
原创粉丝点击